在 keras(tensorflow 后端)中计算梯度时出错

Posted

技术标签:

【中文标题】在 keras(tensorflow 后端)中计算梯度时出错【英文标题】:Error in computing gradients in keras(tensorflow backend) 【发布时间】:2021-05-22 19:39:24 【问题描述】:

我正在尝试使用带有以下代码的 tensorflow-gpu 2.4.1 版和 Keras 2.4.3 版计算来自 VGG16 w.r.t 图像输入的 CNN 过滤器之一的梯度:

from keras.applications import VGG16
from keras import backend as K
model = VGG16(weights = 'imagenet', 
             include_top = False)
layer_name = 'block3_conv1'
filter_index = 0
layer_output = model.get_layer(layer_name).output
loss = K.mean(layer_output[:, :, :, filter_index])

grads = K.gradients(loss, model.input)[0]


这会导致以下错误:

RuntimeError: 启用急切执行时不支持 tf.gradients。请改用 tf.GradientTape。

还尝试使用tf.GradientTape 引发另一个错误:

with tf.GradientTape() as gtape:
    grads = gtape.gradient(loss, model.input)

AttributeError: 'KerasTensor' 对象没有属性 '_id'

尝试禁用急切执行也不起作用:

tf.compat.v1.disable_eager_execution()

因为它将渐变返回为无。 我将不胜感激有关解决此问题的任何方式的任何信息。 提前致谢。

【问题讨论】:

不如试试最新的keras.io/examples/vision/visualizing_what_convnets_learn 可能听起来很愚蠢,但请尝试在您的导入中用 tf.keras 替换所有 keras。然后通过 tf.GradientTape 【参考方案1】:

layer = model.get_layer(layer_name)

首先,你需要构建模型图

from tensorflow.keras import models
heatmap_model = models.Model([model.inputs],[layer.output,model.output])

然后你需要运行tf.GradientTape()

with tf.GradientTape() as gtape:
  layer_output, predictions = heatmap_model(img)
  loss = predictions[:,np.argmax(predictions)] 
  grads = gtape.gradient(loss, layer_output)

注意gtape.gradientlayer_output 而不是layer.output

【讨论】:

以上是关于在 keras(tensorflow 后端)中计算梯度时出错的主要内容,如果未能解决你的问题,请参考以下文章

keras 后端 theano/tensorflow

如何在 Keras 中计算精度和召回率

在 keras 中将“learning_phase”用于 tensorflow 后端?

如何强制 keras 使用 tensorflow GPU 后端

Keras 模型(tensorflow 后端)在 python 3.5 中训练得非常好,但在 python 2.7 中非常糟糕

如何确保 Keras 使用 GPU 和 tensorflow 后端?