正确使用tf.optimizer.Adam的方法来最大程度地减少Tensorflow Core 2 alpha中变量的损失

时间:2019-05-05 21:56:52

标签: python python-3.x tensorflow

我正在研究在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中找到错误的完整堆栈跟踪。

1 个答案:

答案 0 :(得分:0)

OP报告解决方案:

  

当我们在更新图像后裁剪大大小小的值时,图像变量将被重新初始化为张量。 optimizer.minimize(loss, img)之后还有另一行用于剪切值。 tf.clip_by_value(img, -1.5, 1.5)。此步骤是将图像变量重新初始化为张量。