gpt4 book ai didi

python - 'tensorflow.python.framework.ops.EagerTensor' 对象没有属性 '_in_graph_mode'

转载 作者:行者123 更新时间:2023-12-03 16:21:45 34 4
gpt4 key购买 nike

我试图通过优化随机“图像”来可视化 CNN 过滤器,以便它在该过滤器上产生高平均激活,这在某种程度上类似于神经风格转移算法。

为此,我使用 TensorFlow==2.2.0-rc。但是在优化的过程中,报错说'tensorflow.python.framework.ops.EagerTensor' object has no attribute '_in_graph_mode' .我尝试调试它,当我不使用 opt.apply_gradients() 时它以某种方式工作。而是手动应用它的渐变,如 img = img - lr * grads但我想使用“亚当”优化器而不是简单的 SGD。

这是我的优化部分代码

opt = tf.optimizers.Adam(learning_rate=lr, decay = 1e-6)
for _ in range(epoch):
with tf.GradientTape() as tape:
tape.watch(img)
y = model(img)[:, :, :, filter]
loss = -tf.math.reduce_mean(y)
grads = tape.gradient(loss, img)
opt.apply_gradients(zip([grads], [img]))

最佳答案

错误的原因是 tf.keras 优化器将梯度应用于变量对象(tf.Variable 类型),而您尝试将梯度应用于张量(tf.Tensor 类型)。张量对象在 TensorFlow 中不可变,因此优化器无法对其应用梯度。

您应该初始化变量 img作为 tf.Variable。这就是你的代码应该是这样的:

# NOTE: The original image is lost here. If this is not desired, then you can
# rename the variable to something like img_var.
img = tf.Variable(img)
opt = tf.optimizers.Adam(learning_rate=lr, decay = 1e-6)

for _ in range(epoch):
with tf.GradientTape() as tape:
tape.watch(img)
y = model(img.value())[:, :, :, filter]
loss = -tf.math.reduce_mean(y)

grads = tape.gradient(loss, img)
opt.apply_gradients(zip([grads], [img]))

此外,建议计算磁带上下文之外的梯度。这是因为保留它会导致磁带跟踪梯度计算本身,从而导致更高的内存使用量。这仅在您想计算高阶梯度时才可取。因为你不需要这些,我把它们放在外面。

注意我已经更改了行 y = model(img)[:, :, :, filter]y = model(img.value())[:, :, :, filter] .这是因为 tf.keras 模型需要张量作为输入,而不是变量(错误或特征?)。

关于python - 'tensorflow.python.framework.ops.EagerTensor' 对象没有属性 '_in_graph_mode',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61166864/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com