如何从中间层计算梯度

2024-05-14 19:29:11 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试将internet代码改编为我拥有的其他模式/代码(Tensorflow 1.15.0)

2主要区别:

  1. 在互联网代码中,“模型”就像一个导入的模块;在我的代码中,图形/模型在主函数中描述为layers集合,并从.ckpt文件(以及更高版本的saver.restore)调用
  2. 我的代码/模型没有调用层的属性(如internet模型中存在的.y_logits、.resized_image、.y_pred)

我正在修改的互联网代码部分是:

model = inception.Inception()
resized_image = model.resized_image
y_logits = model.y_logits
with model.graph.as_default():
    pl_cls_target = tf.placeholder(dtype=tf.int32)
    loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y_logits, labels=[pl_cls_target])
    gradient = tf.gradients(loss, resized_image)

我成功地做到了这一点:(其中“lastLayer”是我的模型的最后一层,有100个输出值)

resized_image = lastLayer.graph.get_tensor_by_name('Placeholder_1:0')
logits = lastLayer
with lastLayer.graph.as_default():
    pl_cls_target = tf.placeholder(dtype=tf.float32)
    loss = tf.reduce_mean(tf.squared_difference(logits, pl_cls_target))
    gradient = tf.gradients(loss, resized_image)

现在,我想计算另一个中间层的梯度,这个中间层有2048个值

通过以下方式查看图表:

op = session.graph.get_operations()
[m.values() for m in op]

2048的所有“行”是:

(<tf.Tensor 'random_uniform_14/RandomUniform:0' shape=(100, 2048) dtype=float32>,)
(<tf.Tensor 'random_uniform_14/mul:0' shape=(100, 2048) dtype=float32>,)
(<tf.Tensor 'random_uniform_14:0' shape=(100, 2048) dtype=float32>,)
(<tf.Tensor 'layer_3/fully_connected/weights:0' shape=(100, 2048) dtype=float32_ref>,)
(<tf.Tensor 'layer_3/fully_connected/weights/Assign:0' shape=(100, 2048) dtype=float32_ref>,)
(<tf.Tensor 'layer_3/fully_connected/weights/read:0' shape=(100, 2048) dtype=float32>,)
(<tf.Tensor 'Const_14:0' shape=(2048,) dtype=float32>,)
(<tf.Tensor 'layer_3/fully_connected/biases:0' shape=(2048,) dtype=float32_ref>,)
(<tf.Tensor 'layer_3/fully_connected/biases/Assign:0' shape=(2048,) dtype=float32_ref>,)
(<tf.Tensor 'layer_3/fully_connected/biases/read:0' shape=(2048,) dtype=float32>,)
(<tf.Tensor 'l2_normalize/Square:0' shape=(100, 2048) dtype=float32>,)
(<tf.Tensor      shape=(1, 2048) dtype=float32>,)
(<tf.Tensor 'l2_normalize/Maximum:0' shape=(1, 2048) dtype=float32>,)
(<tf.Tensor 'l2_normalize/Rsqrt:0' shape=(1, 2048) dtype=float32>,)
(<tf.Tensor 'l2_normalize:0' shape=(100, 2048) dtype=float32>,)
(<tf.Tensor 'save/Assign_25:0' shape=(2048,) dtype=float32_ref>,)
(<tf.Tensor 'save/Assign_26:0' shape=(100, 2048) dtype=float32_ref>,)

我尝试只更改我的“logits”变量,调用其中一些层。 例如:

resized_image = lastLayer.graph.get_tensor_by_name('Placeholder_1:0')
logits = lastLayer.graph.get_tensor_by_name('l2_normalize/Rsqrt:0')
with lastLayer.graph.as_default():
    pl_cls_target = tf.placeholder(dtype=tf.float32)
    loss = tf.reduce_mean(tf.squared_difference(logits, pl_cls_target))
    gradient = tf.gradients(loss, resized_image)

但是没有成功(梯度总是没有)

有什么想法吗


Tags: 代码imagetargettfgraphclspltensor

热门问题