【问题标题】:How can I get a tensor output by a tensorflow.layer如何通过 tensorflow.layer 获得张量输出
【发布时间】:2018-05-17 02:44:06
【问题描述】:

我使用更高级别的张量流层创建了一个 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 提供了指数衰减()函数来允许衰减学习率,这里我只想完全控制学习率,并手动更改)。为此,我的想法是:

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.layers 将创建子图,您可以使用 tensorboard 绘制和查看它。解决方案是,使用 graph.get_operations() 函数输出图中的所有操作,然后查找“logits”层的输出。就我而言,我发现输出张量 logits 的操作名称是“logits/BiasAdd”。因此,我通过logits=graph.get_operation_by_name('logits/BiasAdd').out‌​put[0].. 获得张量 logits。完成!但是,新问题,您需要初始化新定义的优化器。这已经解决了,只需google i
  • 您应该将此作为答案发布并将其标记为“已接受”。

标签: tensorflow layer


【解决方案1】:

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

由于dense layer有bias和weights参数,当你命名它时,你是在命名layer,而不是输出tensor。

tf.identity 返回一个与输入具有相同形状和内容的张量。

因此,只需保留密集层未命名并将其用作 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2019-01-13
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多