如何从名称中获取层的张量

时间:2019-04-05 22:45:38

标签: python tensorflow

为了重用DNN模型的某些隐藏层,我想获取一个隐藏层的张量

这里有一个我想做的简单例子:

import tensorflow as tf

graph = tf.Graph()
with graph.as_default():
  X = tf.placeholder(tf.float32, shape=(None, 28*28), name="X")
  y = tf.placeholder(tf.int64, shape=(None), name="y")
  dnn = X
  he_init = tf.contrib.layers.variance_scaling_initializer()
  for idx, n_hidden in enumerate([10, 10, 10]):
    dnn = tf.layers.dense(dnn, n_hidden, name="hidden{}".format(idx), kernel_initializer=he_init, activation=tf.nn.relu)

  logits = tf.layers.dense(dnn, 5, name="outputs", kernel_initializer=he_init)

  hidden = tf.get_default_graph().get_tensor_by_name("hidden1:0")

get_tensor_by_name函数中,如果我给出X而不是hidden1,它可以工作,但不适用于hidden1。

在进行完训练后,我也打电话给get_tensor_by_name(此处未显示)。

TensorFlow报告操作hidden1在图中不存在。

我在做什么错?我应该如何获得一个隐藏层以便重复使用?

1 个答案:

答案 0 :(得分:0)

这是因为tf.layers调用内部变量的方式不同。 为了能够查看它,只需打印这样的全局变量

...
logits = tf.layers.dense(dnn, 5, name="outputs", kernel_initializer=he_init)        
print(tf.global_variables())
hidden = ...

您会看到,您尝试获取的张量称为hidden1/kernel:0。更改名称就可以了

tf.get_default_graph().get_tensor_by_name('hidden1/kernel:0')