恢复Tensorflow模型并查看变量值

恢复Tensorflow模型并查看变量值,tensorflow,Tensorflow,我声明了一些表示权重和偏差的Tensorflow变量,并在保存它们之前在训练中更新了它们的值,如图所示: # # 5 x 5 x 5 patches, 1 channel, 32 features to compute. weights = {'W_conv1':tf.Variable(tf.random_normal([3,3,3,1,32]), name='w_conv1'), # 5 x 5 x 5 patches, 32 c

我声明了一些表示权重和偏差的Tensorflow变量,并在保存它们之前在训练中更新了它们的值,如图所示:

#                # 5 x 5 x 5 patches, 1 channel, 32 features to compute.
weights = {'W_conv1':tf.Variable(tf.random_normal([3,3,3,1,32]), name='w_conv1'),
           #       5 x 5 x 5 patches, 32 channels, 64 features to compute.
           'W_conv2':tf.Variable(tf.random_normal([3,3,3,32,64]), name='w_conv2'),
           #                                  64 features
           'W_fc':tf.Variable(tf.random_normal([32448,1024]), name='w_fc'), #54080 = ceil(50/2/2) * ceil(50/2/2) * ceil(10/2/2) * 64
           #'W_fc':tf.Variable(tf.random_normal([54080,1024]), name='W_fc'), #54080 = ceil(50/2/2) * ceil(50/2/2) * ceil(20/2/2) * 64
           'out':tf.Variable(tf.random_normal([1024, n_classes]), name='w_out')}

biases = {'b_conv1':tf.Variable(tf.random_normal([32]), name='b_conv1'),
           'b_conv2':tf.Variable(tf.random_normal([64]), name='b_conv2'),
           'b_fc':tf.Variable(tf.random_normal([1024]), name='b_fc'),
           'out':tf.Variable(tf.random_normal([n_classes]), name='b_out')}

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())

    #some training code

    saver = tf.train.Saver()
    saver.save(sess, 'my-save-dir/my-model-10')
然后,我尝试恢复模型并访问变量,如下所示:

weights = {'W_conv1':tf.Variable(-1.0, validate_shape=False, name='w_conv1'),
           #       5 x 5 x 5 patches, 32 channels, 64 features to compute.
           'W_conv2':tf.Variable(-1.0, validate_shape=False, name='w_conv2'),
           #                                  64 features
           'W_fc':tf.Variable(-1.0, validate_shape=False, name='w_fc'), #54080 = ceil(50/2/2) * ceil(50/2/2) * ceil(10/2/2) * 64
           #'W_fc':tf.Variable(tf.random_normal([54080,1024]), name='W_fc'), #54080 = ceil(50/2/2) * ceil(50/2/2) * ceil(20/2/2) * 64
           'out':tf.Variable(-1.0, validate_shape=False, name='w_out')}

biases = {'b_conv1':tf.Variable(-1.0, validate_shape=False, name='b_conv1'),
           'b_conv2':tf.Variable(-1.0, validate_shape=False, name='b_conv2'),
           'b_fc':tf.Variable(-1.0, validate_shape=False, name='b_fc'),
           'out':tf.Variable(-1.0, validate_shape=False, name='b_out')}

with tf.Session() as sess:
    model_saver = tf.train.import_meta_graph('my-save-dir/my-model-10.meta')
    model_saver.restore(sess, "my-save-dir/my-model-10")
    print("Model restored.") 
    print('Initialized')
    print(sess.run(weights['W_conv1']))

但是,我得到了一个“FailedPremissionError:尝试使用未初始化的值w_conv1”。请协助。

以下是您的第二个代码片段中发生的情况:您首先创建所有变量
w_conv1
to
b_out
,以便使用相应的节点填充默认图。然后调用
import\u meta\u graph(..)
,默认图中再次填充了存储在第一个代码段中的模型中的所有节点。但是,对于它尝试加载的每个节点,另一个同名节点已经存在(因为您之前“手动”创建了它)。我不知道在这种情况下内部会发生什么,但是在调用
import\u meta\u graph(…)
之后查看
tf.global\u variables()
的输出可以发现,现在每个节点都有两个完全相同的名称。所以还原可能是未定义的,它可能只还原了一半的变量,这就是为什么您会看到这个错误

所以,你有两种可能来解决这个问题:

1)不要使用
从元图导入

weights = {'W_conv1':tf.Variable(tf.random_normal([3,3,3,1,32]), name='w_conv1'),
           #       5 x 5 x 5 patches, 32 channels, 64 features to compute.
           'W_conv2':tf.Variable(tf.random_normal([3,3,3,32,64]), name='w_conv2'),
           #                                  64 features
           'W_fc':tf.Variable(tf.random_normal([32448,1024]), name='w_fc'), #54080 = ceil(50/2/2) * ceil(50/2/2) * ceil(10/2/2) * 64
           #'W_fc':tf.Variable(tf.random_normal([54080,1024]), name='W_fc'), #54080 = ceil(50/2/2) * ceil(50/2/2) * ceil(20/2/2) * 64
           'out':tf.Variable(tf.random_normal([1024, n_classes]), name='w_out')}

biases = {'b_conv1':tf.Variable(tf.random_normal([32]), name='b_conv1'),
           'b_conv2':tf.Variable(tf.random_normal([64]), name='b_conv2'),
           'b_fc':tf.Variable(tf.random_normal([1024]), name='b_fc'),
           'out':tf.Variable(tf.random_normal([n_classes]), name='b_out')}

with tf.Session() as sess:
    model_saver = tf.train.Saver()
    model_saver.restore(sess, "my-save-dir/my-model-10")
    print("Model restored.")
    print('Initialized')
    print(sess.run(weights['W_conv1']))
2)使用
import\u from\u metagraph
但不要手动重新创建图形

那么,就这样:

with tf.Session() as sess:
    model_saver = tf.train.import_meta_graph('my-save-dir/my-model-10.meta')
    model_saver.restore(sess, "my-save-dir/my-model-10")
    print("Model restored.") 
    print('Initialized')
    print(sess.run(tf.get_default_graph().get_tensor_by_name('w_conv1:0')))
请注意,在这种情况下,您需要更改在“w_conv1”(最后一行)中检索值的方式。除了调用
get\u tensor\u by\u name()
之外,您还可以使用
tf.get\u variable()
,但要实现这一点,您必须使用
tf.get\u variable()
创建变量。查看此帖子了解更多详细信息: