首页 > 解决方案 > 在 keras(tensorflow 后端)中计算梯度时出错

问题描述

我正在尝试使用 tensorflow-gpu 版本 2.4.1 和 Keras 版本 2.4.3 使用以下代码计算来自 VGG16 的 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()

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

标签: pythontensorflowkerasgradient

解决方案


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


推荐阅读