【发布时间】: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').output[0].. 获得张量 logits。完成!但是,新问题,您需要初始化新定义的优化器。这已经解决了,只需google i -
您应该将此作为答案发布并将其标记为“已接受”。
标签: tensorflow layer