我有一个基于 TensorFlow 的神经网络和一组变量。
训练函数是这样的:
def train(load = True, step)
"""
Defining the neural network is skipped here
"""
train_step = tf.train.AdamOptimizer(1e-4).minimize(mse)
# Saver
saver = tf.train.Saver()
if not load:
# Initalizing variables
sess.run(tf.initialize_all_variables())
else:
saver.restore(sess, 'Variables/map.ckpt')
print 'Model Restored!'
# Perform stochastic gradient descent
for i in xrange(step):
train_step.run(feed_dict = {x: train, y_: label})
# Save model
save_path = saver.save(sess, 'Variables/map.ckpt')
print 'Model saved in file: ', save_path
print 'Training Done!'
我这样调用训练函数:
# First train
train(False, 1)
# Following train
for i in xrange(10):
train(True, 10)
我进行了这种训练,因为我需要向我的模型提供不同的数据集。但是,如果我以这种方式调用训练函数,TensorFlow 将生成错误消息,指示它无法从文件中读取保存的模型。
经过一些实验,我发现发生这种情况是因为检查点保存速度很慢。在文件写入磁盘之前,下一个训练函数将开始读取,从而生成错误。
我尝试使用 time.sleep() 函数在每次调用之间进行一些延迟,但它不起作用。
有人知道如何解决这种写入/读取错误吗?非常感谢!
您的代码中有一个微妙的问题:每次您调用train()
函数中,对于所有模型变量和神经网络的其余部分,更多节点会添加到同一个 TensorFlow 图中。这意味着每次你构造一个tf.train.Saver()
,它包括之前调用的所有变量train()
。每次重新创建模型时,都会使用额外的变量创建变量_N
后缀给它们一个独特的名称:
- 用变量构造的 Saver
var_a
, var_b
.
- 用变量构造的 Saver
var_a
, var_b
, var_a_1
, var_b_1
.
- 用变量构造的 Saver
var_a
, var_b
, var_a_1
, var_b_1
, var_a_2
, var_b_2
.
- etc.
默认行为为tf.train.Saver
是将每个变量与相应操作的名称关联起来。这意味着var_a_1
不会被初始化var_a
,因为它们最终有不同的名字。
解决方案是每次调用时创建一个新图表train()
。修复它的最简单方法是更改主程序,为每次调用创建一个新图表train()
如下:
# First train
with tf.Graph().as_default():
train(False, 1)
# Following train
for i in xrange(10):
with tf.Graph().as_default():
train(True, 10)
...或者,同等地,您可以移动with
块内train()
功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)