I. *_*. A 3 optimization tensorflow
我已经在Tensorflow中训练了一个模型。在训练过程中,我正在优化器中设置var_list,换句话说,我正在CNN顶部训练GRU。这是优化器的代码:
with tf.name_scope('optimizer'):
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
optimizer = tf.train.AdamOptimizer(0.0001).minimize(MSE, var_list=gru_output_var_list)
Run Code Online (Sandbox Code Playgroud)
然后,经过训练并将变量保存在检查点中,我试图var_list从优化器中删除,以便能够对整个网络进行微调,并使用GRU转换图层。但是,这引发了一个错误:
Key weight_fc_sig/Adam_1 not found in checkpoint
Run Code Online (Sandbox Code Playgroud)
其中weight_fc_sig是模型中变量之一的名称。
我通读了github,发现优化器的状态以及变量都保存在检查点中。因此,我想知道如何解决此问题,换句话说,我需要知道如何重置优化器的状态。
任何帮助深表感谢!!
首先,我在tensorflow中构建一个模型,然后通过以下方式将带有变量的图形保存到检查点中:
saver = tf.train.Saver()
saver.save(sess, model_path + "ckpt")
Run Code Online (Sandbox Code Playgroud)
因此,当我检查通过以下方式存储的变量列表时:
from tensorflow.python import pywrap_tensorflow
model_path = 'C:/Users/user/PycharmProjects/TensorflowDifferentProjects/MNIStDataset/tensorlogs/ckpt'
reader = pywrap_tensorflow.NewCheckpointReader(model_path)
var_to_shape_map = reader.get_variable_to_shape_map()
for key in sorted(var_to_shape_map):
print("tensor_name: ", key)
Run Code Online (Sandbox Code Playgroud)
我得到以下变量列表:
tensor_name: Adam_optimizer/beta1_power
tensor_name: Adam_optimizer/beta2_power
tensor_name: conv1/biases
tensor_name: conv1/biases/Adam
tensor_name: conv1/biases/Adam_1
tensor_name: conv1/weights
tensor_name: conv1/weights/Adam
tensor_name: conv1/weights/Adam_1
tensor_name: conv2/biases
tensor_name: conv2/biases/Adam
tensor_name: conv2/biases/Adam_1
tensor_name: conv2/weights
tensor_name: conv2/weights/Adam
tensor_name: conv2/weights/Adam_1
tensor_name: fc1/biases
tensor_name: fc1/biases/Adam
tensor_name: fc1/biases/Adam_1
tensor_name: fc1/weights
tensor_name: fc1/weights/Adam
tensor_name: fc1/weights/Adam_1
tensor_name: fc2/biases
tensor_name: fc2/biases/Adam
tensor_name: fc2/biases/Adam_1
tensor_name: fc2/weights
tensor_name: fc2/weights/Adam
tensor_name: fc2/weights/Adam_1
Run Code Online (Sandbox Code Playgroud)
当我再次训练同一模型时,但是这次,我仅将权重和偏差的列表传递给保护程序,即:saver = tf.train.Saver(var_list = lst_vars),然后打印出保存了权重和偏见,我得到以下列表:
tensor_name: conv1/biases
tensor_name: conv1/weights
tensor_name: conv2/biases
tensor_name: conv2/weights
tensor_name: fc1/biases
tensor_name: fc1/weights
tensor_name: fc2/biases
tensor_name: fc2/weights
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试再次运行相同的模型,但是删除了要还原的变量列表时,现在有了这个保护程序:
saver = tf.train.Saver(),
Run Code Online (Sandbox Code Playgroud)
我遇到以下错误:
Key fc2/weights/Adam_1 not found in checkpoint.
Run Code Online (Sandbox Code Playgroud)
因此,解决方案是明确提及我需要还原的变量列表。换句话说,即使当我仅保存需要存储的权重和偏差列表时,在导入它们时,我也应该特别提及它们,因此我应该说:
saver = tf.train.Saver(var_list=lst_vars)
Run Code Online (Sandbox Code Playgroud)
其中lst_vars是我需要还原的变量列表,与上面打印的变量列表相同。
所以总的来说会发生什么事,就是每当我们尝试还原图形时,如果我没有提到要还原的变量列表,tensorflow就会看到并发现有一些尚未存储的变量,换句话说,每当没有列表时tensorflow假设我们正在尝试还原整个图,这是不正确的。我只恢复负责权衡和偏见的部分。因此,一旦提到这一点,张量流将知道我不是在初始化整个图,而是对其进行初始化。
现在,即使我确实提到了需要还原的变量列表,如下所示:
saver = tf.train.Saver(var_list=lst_vars)
Run Code Online (Sandbox Code Playgroud)
这不会造成任何问题
同时,即使我为优化器传递了变量列表,其工作方式也如下:
with tf.name_scope('Adam_optimizer'):
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy, var_list=lst_vars[:3])
saver = tf.train.Saver(var_list=lst_vars)
Run Code Online (Sandbox Code Playgroud)
然后,我可以再次运行相同的模型,但是优化器中没有var_list参数。这样的话,可以很好地调整时间。
现在,要加倍努力,我可以修改模型,添加更多层,但请记住,因为在检查点中仅存储了以下变量:
tensor_name: conv1/biases
tensor_name: conv1/weights
tensor_name: conv2/biases
tensor_name: conv2/weights
tensor_name: fc1/biases
tensor_name: fc1/weights
tensor_name: fc2/biases
tensor_name: fc2/weights
Run Code Online (Sandbox Code Playgroud)
我应该向保护程序提及这些是我要还原的变量。所以我说了以下几点:
saver = tf.train.Saver(var_list=[lst_vars[0], lst_vars[1], lst_vars[2], lst_vars[3],
lst_vars[6], lst_vars[7], lst_vars[8], lst_vars[9]])
Run Code Online (Sandbox Code Playgroud)
在这种情况下,将没有问题,并且代码可以正常运行!!!我也可以要求优化器训练新模型,也许训练某些参数,我的意思是权重和偏差等等。
另外,请注意,我可以将整个模型另存为:
saver = tf.train.Saver()
Run Code Online (Sandbox Code Playgroud)
然后还原模型的一部分(通过再次运行模型,然后传递:
saver = tf.train.Saver(var_list=lst_vars))
Run Code Online (Sandbox Code Playgroud)
另外,我可以修改模型,也可以添加更多转换层。因此,只要我确切提到要还原的变量,就可以对模型进行微调。例如:
saver = tf.train.Saver(var_list=[lst_vars[0], lst_vars[1], lst_vars[2], lst_vars[3],
lst_vars[6], lst_vars[7], lst_vars[8], lst_vars[9]])
Run Code Online (Sandbox Code Playgroud)
所有这些解释的出现是因为我尽管优化器可能存在一些问题,但我需要知道如何解决它。在github上提出了一个问题,确切地说是关于如何优化优化器的问题,以及为什么我得出所有这些结论的问题。
这是任何感兴趣的人的代码:
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
import os
def conv2d(x, w):
return tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')
def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
def weight_variable(shape, name):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial, name=name)
def bias_variable(shape, name):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial, name=name)
def deepnn(x):
with tf.name_scope('reshape'):
x_image = tf.reshape(x, [-1, 28, 28, 1])
# First convolutional layer, maps one grayscale image to 32 feature maps.
with tf.name_scope('conv1'):
w_conv1 = weight_variable([5, 5, 1, 32], name='weights')
b_conv1 = bias_variable([32], name='biases')
h_conv1 = tf.nn.relu(conv2d(x_image, w_conv1) + b_conv1)
# Pooling layer, downsampling by 2X
with tf.name_scope('pool1'):
h_pool1 = max_pool_2x2(h_conv1)
# Second convolutional layer -- maps 32 feature maps to 64
with tf.name_scope('conv2'):
w_conv2 = weight_variable([5, 5, 32, 64], name='weights')
b_conv2 = bias_variable([64], name='biases')
h_conv2 = tf.nn.relu(conv2d(h_pool1, w_conv2) + b_conv2)
# Second pooling layer
with tf.name_scope('pool2'):
h_pool2 = max_pool_2x2(h_conv2)
# Fully connected layer 1 -- after 2 round of downsampling, our 28 x 28 image is
# down to 7 x 7 x 64 feature maps -- maps this to 1024 features.
with tf.name_scope('fc1'):
w_fc1 = weight_variable([7 * 7 * 64, 1024], name='weights')
b_fc1 = bias_variable([1024], name='biases')
h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1)
# Dropout - control the complexity of the model, prevents co-adaptation of features
with tf.name_scope('dropout'):
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
# Map the 1024 features to 10 classes, one for each digit.
with tf.name_scope('fc2'):
w_fc2 = weight_variable([1024, 10], name='weights')
b_fc2 = bias_variable([10], name='biases')
y_conv = tf.matmul(h_fc1_drop, w_fc2) + b_fc2
return y_conv, keep_prob
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
# Create the model
x = tf.placeholder(tf.float32, [None, 784])
# Define loss and optimizer
y_ = tf.placeholder(tf.float32, [None, 10])
# Build the graph for the deep net
y_conv, keep_prob = deepnn(x)
with tf.name_scope('loss'):
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv)
cross_entropy = tf.reduce_mean(cross_entropy)
# Note that this list of variables only include the weights and biases in the model.
lst_vars = []
for v in tf.global_variables():
lst_vars.append(v)
print(v.name, '....')
with tf.name_scope('Adam_optimizer'):
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
with tf.name_scope('accuracy'):
correct_prediction = tf.equal(tf.arg_max(y_conv, 1), tf.arg_max(y_, 1))
correct_prediction = tf.cast(correct_prediction, tf.float32)
accuracy = tf.reduce_mean(correct_prediction)
model_path = 'C:/Users/user/PycharmProjects/TensorflowDifferentProjects/MNIStDataset/tensorlogs/'
saver = tf.train.Saver(var_list=lst_vars)
train_writer = tf.summary.FileWriter(model_path + "EventsFile/")
train_writer.add_graph(tf.get_default_graph())
for v in tf.global_variables():
print(v.name)
# Note that a session is created within a with block so that it is destroyed
# once the block has been exited.
with tf.Session() as sess:
print('all variables initialized!!')
sess.run(tf.global_variables_initializer())
ckpt = tf.train.get_checkpoint_state(
os.path.dirname(model_path))
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
print('checkpoints are saved!!!')
else:
print('No stored checkpoints')
for i in range(700):
batch = mnist.train.next_batch(50)
if i % 100 == 0:
train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})
print('step %d, training accuracy %g' % (i, train_accuracy))
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
print('test accuracy %g' % accuracy.eval(feed_dict={
x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))
save_path = saver.save(sess, model_path + "ckpt")
Run Code Online (Sandbox Code Playgroud)
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
import os
def conv2d(x, w):
return tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')
def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
def weight_variable(shape, name):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial, name=name)
def bias_variable(shape, name):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial, name=name)
def deepnn(x):
with tf.name_scope('reshape'):
x_image = tf.reshape(x, [-1, 28, 28, 1])
# First convolutional layer, maps one grayscale image to 32 feature maps.
with tf.name_scope('conv1'):
w_conv1 = weight_variable([5, 5, 1, 32], name='weights')
b_conv1 = bias_variable([32], name='biases')
h_conv1 = tf.nn.relu(conv2d(x_image, w_conv1) + b_conv1)
# Pooling layer, downsampling by 2X
with tf.name_scope('pool1'):
h_pool1 = max_pool_2x2(h_conv1)
# Second convolutional layer -- maps 32 feature maps to 64
with tf.name_scope('conv2'):
w_conv2 = weight_variable([5, 5, 32, 64], name='weights')
b_conv2 = bias_variable([64], name='biases')
h_conv2 = tf.nn.relu(conv2d(h_pool1, w_conv2) + b_conv2)
# Second pooling layer
with tf.name_scope('pool2'):
h_pool2 = max_pool_2x2(h_conv2)
with tf.name_scope('conv3'):
w_conv3 = weight_variable([1, 1, 64, 64], name='weights')
b_conv3 = bias_variable([64], name='biases')
h_conv3 = tf.nn.relu(conv2d(h_pool2, w_conv3) + b_conv3)
# Fully connected layer 1 -- after 2 round of downsampling, our 28 x 28 image is
# down to 7 x 7 x 64 feature maps -- maps this to 1024 features.
with tf.name_scope('fc1'):
w_fc1 = weight_variable([7 * 7 * 64, 1024], name='weights')
b_fc1 = bias_variable([1024], name='biases')
h_conv3_flat = tf.reshape(h_conv3, [-1, 7 * 7 * 64])
h_fc1 = tf.nn.relu(tf.matmul(h_conv3_flat, w_fc1) + b_fc1)
# Dropout - control the complexity of the model, prevents co-adaptation of features
with tf.name_scope('dropout'):
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
# Map the 1024 features to 10 classes, one for each digit.
with tf.name_scope('fc2'):
w_fc2 = weight_variable([1024, 10], name='weights')
b_fc2 = bias_variable([10], name='biases')
y_conv = tf.matmul(h_fc1_drop, w_fc2) + b_fc2
return y_conv, keep_prob
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
# Create the model
x = tf.placeholder(tf.float32, [None, 784])
# Define loss and optimizer
y_ = tf.placeholder(tf.float32, [None, 10])
# Build the graph for the deep net
y_conv, keep_prob = deepnn(x)
with tf.name_scope('loss'):
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv)
cross_entropy = tf.reduce_mean(cross_entropy)
# Note that this list of variables only include the weights and biases in the model.
lst_vars = []
for v in tf.global_variables():
lst_vars.append(v)
print(v.name, '....')
with tf.name_scope('Adam_optimizer'):
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
with tf.name_scope('accuracy'):
correct_prediction = tf.equal(tf.arg_max(y_conv, 1), tf.arg_max(y_, 1))
correct_prediction = tf.cast(correct_prediction, tf.float32)
accuracy = tf.reduce_mean(correct_prediction)
model_path = 'C:/Users/user/PycharmProjects/TensorflowDifferentProjects/MNIStDataset/tensorlogs/'
saver = tf.train.Saver(var_list=[lst_vars[0], lst_vars[1], lst_vars[2], lst_vars[3],
lst_vars[6], lst_vars[7], lst_vars[8], lst_vars[9]])
train_writer = tf.summary.FileWriter(model_path + "EventsFile/")
train_writer.add_graph(tf.get_default_graph())
for v in tf.global_variables():
print(v.name)
# Note that a session is created within a with block so that it is destroyed
# once the block has been exited.
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print('all variables initialized!!')
ckpt = tf.train.get_checkpoint_state(
os.path.dirname(model_path))
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
print('checkpoints are saved!!!')
else:
print('No stored checkpoints')
for i in range(700):
batch = mnist.train.next_batch(50)
if i % 100 == 0:
train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})
print('step %d, training accuracy %g' % (i, train_accuracy))
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
print('test accuracy %g' % accuracy.eval(feed_dict={
x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))
save_path = saver.save(sess, model_path + "ckpt")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2864 次 |
| 最近记录: |