python - 在 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()
因为它将梯度返回为无。我将不胜感激有关解决此问题的任何方式的任何信息。提前致谢。
解决方案
让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.gradient
有layer_output
而不是layer.output
推荐阅读
- python - 如何生成粉红噪声图像?
- flutter - Flutter 如何合并数组
- javascript - 如何使前置元素在顶部溢出窗口?
- python-3.x - 如何使用 spotipy 从播放列表中获取 playlist_id?
- sql - SQL案例操作
- javascript - 反应道具中联合和交叉类型的问题
- python - Django 错误 ModelForm 没有指定模型类
- mysql - 如果没有第二个连接到第一个连接,如何将第一个连接的过滤器列表中的值添加到第一个连接的结果中,添加行值?
- javascript - 比较 postgres 时间戳和 JavaScript 日期对象
- laravel - 如何在 laravel 8 中使用关系