如何通过 tensorflow.layer 获得张量输出

How can I get a tensor output by a tensorflow.layer

我使用更高级别的张量流层创建了一个 CNN 模型,例如

conv1 = tf.layers.conv2d(...)
maxpooling1 = tf.layers.max_pooling2d(...)
conv2 = tf.layers.conv2d(...)
maxpooling2 = tf.layers.max_pooling2d(...)
flatten = tf.layers.flatten(...)
logits = tf.layers.dense(...)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(...))
optimizer = tf.train.AdadeltaOptimizer(init_lr).minimize(loss)
acc = tf.reduce_mean(...)

模型训练和保存都很好,到目前为止一切都很好。接下来,我想加载这个保存的模型,改变学习率,并继续训练(我知道 tensorflow 提供 exponential_decay() 函数来允许衰减学习率,这里我只想完整学习率的控制,并手动更改)。为此,我的想法是:

saver = tf.train.import_meta_grah(...)
saver.restore(sess, tf.train.latest_chechpoint(...))
graph = tf.get_default_graph()

inputImg_ = graph.get_tensor_by_name(...)  # this is place_holder in model
labels_ = graph.get_tensor_by_name(...)  # place_holder in model
logits = graphget_tensor_by_name(...) # output of dense layer
loss = grah.get_tensor_by_name(...) # loss
optimizer = tf.train.AdadeltaOptimizer(new_lr).minimize(loss) # I give it a new learning rate
acc = tf.reduce_mean(...)

现在我遇到了问题。上面的代码可以成功获取到inputmg_,labels_,因为我在定义的时候就给它们取了名字。但是我无法获得 logits,因为 logits = tf.layers.dense(name='logits') 这个名字实际上是给密集层的,而不是输出张量 logits。这意味着,我也无法获得张量 conv1、conv2。 tensorflow 似乎无法命名一个层输出的张量。在这种情况下,有没有办法获得这些张量,如logits、conv1、maxpooling1?我已经搜索了一段时间但没有找到答案。

我遇到了同样的问题并使用 tf.identity 解决了它。

由于密集层有偏差和权重参数,所以当你命名它时,你是在命名层,而不是输出张量。

tf.identity returns 与输入具有相同形状和内容的张量。

所以只保留密集层未命名并将其用作 tf.identity

的输入
self.output = tf.layers.dense(hidden_layer3, 2)
self.output = tf.identity(self.output, name='output')

现在您可以加载输出

output = graph.get_tensor_by_name('output:0')