首页 > 解决方案 > 如何从名称中获取图层的张量

问题描述

为了重用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图中不存在操作 , 。

我究竟做错了什么?我想如何获得一个隐藏层以便重新使用它?

标签: pythontensorflow

解决方案


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

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

你会看到,你想要得到的那个张量被称为hidden1/kernel:0. 改个名字就OK了

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

推荐阅读