我正在研究在Tensorflow 2中实现简单的神经样式转换。我已经看到了这个官方Tensorflow tutorial。
我按照教程中的说明编写了训练循环:
img = tf.Variable(content_img)
for t in range(max_iter):
with tf.GradientTape() as tape:
tape.watch(img)
loss = getStyleTransferLoss(img, cnn)
# Compute gradient
grad = tape.gradient(loss, img)
optimizer.apply_gradients([(grad, img)])
但是,我最终遇到以下错误:
AttributeError:“ tensorflow.python.framework.ops.EagerTensor”对象没有属性“ _in_graph_mode”
我还尝试了其他变体,例如摆脱GradientTape并直接使用优化器以最小化img上的损失。
optimizer.minimize(loss, var_list = [img_var])
在两种情况下,我最终都会遇到相同的错误。 如果删除优化器,循环将运行而没有任何错误。甚至stacktrace都表明问题出在优化器上。
可以在此paste link中找到错误的完整堆栈跟踪。
答案 0 :(得分:0)
OP报告解决方案:
当我们在更新图像后裁剪大大小小的值时,图像变量将被重新初始化为张量。
optimizer.minimize(loss, img)
之后还有另一行用于剪切值。tf.clip_by_value(img, -1.5, 1.5)
。此步骤是将图像变量重新初始化为张量。