【发布时间】:2017-03-06 21:05:08
【问题描述】:
我正在尝试在 Tensorflow 中恢复我训练过的模型。问题是似乎没有正确恢复权重。
对于训练,我将权重和偏差定义为:
W = {
'h1': tf.Variable(tf.random_normal([n_inputs, n_hidden_1]), name='wh1'),
'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2]), name='wh2'),
'o': tf.Variable(tf.random_normal([n_hidden_2, n_classes]), name='wo')
}
b = {
'b1': tf.Variable(tf.random_normal([n_hidden_1]), name='bh1'),
'b2': tf.Variable(tf.random_normal([n_hidden_2]), name='bh2'),
'o': tf.Variable(tf.random_normal([n_classes]), name='bo')
}
然后我对自己的自定义二维图像数据集进行一些训练,并通过调用tf.saver保存模型
saver = tf.train.Saver()
saver.save(sess, 'tf.model')
稍后我想用完全相同的权重恢复该模型,所以我像以前一样构建模型(也使用random_normal 初始化)并调用tf.saver.restore
saver = tf.train.import_meta_graph('tf.model.meta')
saver.restore(sess, tf.train.latest_checkpoint('./'))
现在,如果我打电话:
temp = sess.run(W['h1'][0][0])
print temp
我得到的是随机值,而不是重量的恢复值。
我在这个上画了一个空白,有人能指出我正确的方向吗?
仅供参考,我已经尝试(没有)运气来简单地声明tf.Variables,但我不断得到:
ValueError: initial_value must be specified.
尽管 Tensorflow 自己声明应该可以简单地声明没有初始值(https://www.tensorflow.org/programmers_guide/variables 部分:恢复值)
更新 1
当我按照建议运行时
all_vars = tf.global_variables()
for v in all_vars:
print v.name
我得到以下输出:
wh1:0
wh2:0
wo:0
bh1:0
bh2:0
bo:0
wh1:0
wh2:0
wo:0
bh1:0
bh2:0
bo:0
beta1_power:0
beta2_power:0
wh1/Adam:0
wh1/Adam_1:0
wh2/Adam:0
wh2/Adam_1:0
wo/Adam:0
wo/Adam_1:0
bh1/Adam:0
bh1/Adam_1:0
bh2/Adam:0
bh2/Adam_1:0
bo/Adam:0
bo/Adam_1:0
这表明变量确实被读取了。但是调用
print sess.run("wh1:0")
导致错误:尝试使用未初始化的值 wh1
【问题讨论】:
-
您是否尝试运行
sess,run( "wh1:0" ),这应该是图中权重变量的名称?另一个调试建议是打印所有恢复的变量名称all_vars = tf.global_variables()for v in all_vars:print v.name -
另外,使用restore的时候不要初始化全局变量。
-
@Kochoba:请查看我对原始问题的更新。我已经添加了你建议我运行的输出。但是,我从
print sess.run("wh1:0")收到一个错误,因为它没有被初始化。我该如何解决? -
我用来恢复模型的代码如下,虽然我看到很多人建议你使用的方法。当我保存我使用的模型时:
saver.save(sess,"model.ckpt",global_step=global_step)global_step 变量是可选的。然后,当我恢复我刚刚使用的模型时:saver.restore(sess,"model.ckpt-<the global_step number>")我知道saver = tf.train.import_meta_graph('tf.model.meta')恢复了一个包含所有变量名称的未初始化图,但tf.train.latest_checkpoint('./')可能无法获取存储的值。
标签: python tensorflow