我训练了一个模型来预测序列中的下一个单词。我使用tf.train.Saver()保存了模型。但是,当我恢复模型并提供相同的种子值时,每次运行测试时输出都会更改。例如,如果我给它提供“生日快乐”,它将预测为“您”,但是,如果我在10秒钟后运行它,它将预测为“ rhyno”。我感觉这可能是由于我将内部图层随机初始化为随机的正常权重,但是,恢复模型不会在训练后恢复值并且不会重新初始化图层吗?我的还原代码如下:
with tf.Session() as sess:
saved_model = tf.train.import_meta_graph(
'C:/Users/me/my_model.meta') # load graph from training
saved_model.restore(sess, tf.train.latest_checkpoint('./'))
imported_graph = tf.get_default_graph()
x = imported_graph.get_operation_by_name("ph_x").outputs[0]
prediction = imported_graph.get_tensor_by_name('prediction:0')
run_input = seed_values
print(np.array2string(run_input, separator=" "))
for _ in range(production_size):
run_input_oh = hlp.word_to_one_hot(run_input, hp_dict, 0)
pred = hlp.one_hot_to_word(sess.run(prediction, feed_dict={x: run_input_oh}), rev_dict)
print(sess.run(prediction, feed_dict={x: run_input_oh}))
答案 0 :(得分:0)
还原保存的权重后,您调用了默认图。这将忽略恢复的体重。 解: 首先调用默认图形,然后恢复权重!
尝试一下!
with tf.Session() as sess:
saved_model = tf.train.import_meta_graph(
'C:/Users/me/my_model.meta') # load graph from training
imported_graph = tf.get_default_graph()
saved_model.restore(sess, tf.train.latest_checkpoint('./'))
...
答案 1 :(得分:0)
@midhun pk的答案是错误的,调用import_meta_graph
不会修改图形,并且在save_model.restore之前或之后调用它没有区别。
您的代码似乎很好(调用restore
将保存的图的节点添加到当前图,并调用print(sess.run(variable))
恢复变量的状态),并且如果没有更多有关以下内容的信息,则很难调试您的模型。 (例如,run_input,seed_values等是什么?)您能提供一个最小的可重现示例吗?
您应该能够通过在保存和还原时打印变量的值来验证变量是否正确还原。保存之前,您可以执行tf.Print
(或使用var_value = imported_graph.get_tensor_by_name("XX:0")
print(sess.run(var_value))
)。还原后,可以按以下方式检查已还原变量的权重:假设变量名称为“ XX”,请执行以下操作:
{{1}}
答案 2 :(得分:0)
我能够找到问题,但它没有处理调用已保存权重的过程。
当我第一次建立训练模型时,我通过创建一个集合从文本文件创建了一个字典。在测试中,我假设元素的顺序保持不变,但是从相同的文本文件构建了字典。不要做这个假设。顺序可以更改,因此结果看似随机。