gpt4 book ai didi

optimization - 更改优化器参数后在 Tensorflow 中错误恢复模型

转载 作者:行者123 更新时间:2023-12-03 16:28:28 29 4
gpt4 key购买 nike

我已经在 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)

然后,在训练之后,并将变量保存在检查点中,我试图删除 var_list来自优化器为了能够微调整个网络,使用 GRU 卷积层。但是,这引发了一个错误:
Key weight_fc_sig/Adam_1 not found in checkpoint

哪里 weight_fc_sig是模型中变量之一的名称。

我通读了github,发现优化器的状态和checkpoint中的变量都被保存了。所以,我想知道如何解决这个问题,换句话说,我需要知道如何重置优化器的状态。

任何帮助深表感谢!!

最佳答案

首先,我在 tensorflow 中构建了一个模型,然后我将带有变量的图形保存到一个检查点中:

saver = tf.train.Saver()
saver.save(sess, model_path + "ckpt")
因此,当我检查通过以下方式存储的变量列表时:
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)
我得到以下变量列表:
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
当我再次训练相同的模型时,但这一次,我仅将权重和偏差列表传递给保护程序:
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
现在,当我尝试再次运行相同的模型时,但删除了要恢复的变量列表,所以我现在有了这个保护程序:
saver = tf.train.Saver(), 
我遇到了以下错误:
Key fc2/weights/Adam_1 not found in checkpoint.
因此,解决方案是明确提及我需要恢复的变量列表。换句话说,即使当我只
保存了我需要存储的权重和偏差列表,在导入它们时,我应该特别提到它们,所以我应该
说:
saver = tf.train.Saver(var_list=lst_vars) 
哪里 lst_vars是我需要恢复的变量列表,它与那个相同
印在上面。
所以总的来说,每当我们尝试恢复图形时,如果我没有提到要恢复的变量列表,
tensorflow 会查看有一些变量尚未存储,换句话说,只要没有列表,
tensorflow 假设我们正在尝试恢复整个图,但事实并非如此。我只是恢复负责的部分
对于权重和偏差。所以一旦提到这一点,tensorflow 就会知道我不是在初始化整个图,而是部分
其中。

现在,即使我真的提到了我需要恢复的变量列表,如下:
saver = tf.train.Saver(var_list=lst_vars)
这不会造成任何问题
此外,我可以添加/修改传递给优化器的 var_list,这也不会导致任何问题。
同时,即使我传递了优化器要处理的变量列表:
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)
然后我可以再次运行相同的模型,但优化器中没有 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

我应该向保护程序提及这些是我正在恢复的变量。所以我说了以下几点:
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]])
在这种情况下,不会有任何问题并且代码会运行良好!!!
我也可以要求优化器训练新模型,也许训练某些参数,我的意思是权重和偏差等等......
另外,请注意,我可以将整个模型保存为:
saver = tf.train.Saver()
然后恢复模型的一部分(通过再次运行模型,并通过:
saver = tf.train.Saver(var_list=lst_vars))
此外,我可以修改模型并添加更多的卷积层。所以我可以微调模型,只要我确切地提到了什么
我正在恢复的变量。前任:
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]])
所有这些解释都是因为我认为优化器可能存在一些问题,我需要知道如何休息。在 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")
和修改后的模型(我添加了另一个卷积层):
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")

关于optimization - 更改优化器参数后在 Tensorflow 中错误恢复模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48161147/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com