我使用较高级别的Tensorflow层创建了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(...)
Run Code Online (Sandbox Code Playgroud)
该模型已经过良好训练和保存,到目前为止一切都很好。接下来,我想加载此保存的模型,更改学习率,然后继续训练(我知道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(...)
Run Code Online (Sandbox Code Playgroud)
现在我遇到了问题。上面的代码可以成功获取inputmg_,labels_,因为我在定义它们时将其命名。但是我无法获得logits,因为logits = tf.layers.dense(name ='logits')实际上是将名称赋予密集层而不是输出张量logits。那就是说,我也无法获得张量conv1,conv2。看来tensorflow无法按层命名张量输出。在这种情况下,是否有办法获取这些张量,例如logits,conv1,maxpooling1?我已经搜索了一段时间,但没有成功。
小智 4
我遇到了同样的问题并使用 tf.identity 解决了它。
由于密集层具有偏差和权重参数,因此当您命名它时,您是在命名该层,而不是输出张量。
tf.identity 返回一个与输入具有相同形状和内容的张量。
因此,只需保留密集层未命名并将其用作 tf.identity 的输入
self.output = tf.layers.dense(hidden_layer3, 2)
self.output = tf.identity(self.output, name='output')
Run Code Online (Sandbox Code Playgroud)
现在您可以加载输出
output = graph.get_tensor_by_name('output:0')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5224 次 |
| 最近记录: |