【问题标题】:Tape is required when a tensor loss is passed通过张量损失时需要磁带
【发布时间】:2020-08-18 03:32:38
【问题描述】:

我有以下损失:

loss = loss(y_train_left_noc[:,:,0], soft_argmin).tolist()

其中类型(损失)是

但是,在像这样在优化器中使用这种损失时:

train = tf.keras.optimizers.Adam().minimize(loss, [k1, k2, k3])

其中 k1、k2 和 k3 是卷积核,我得到以下错误:

Traceback (most recent call last):
  File "train.py", line 277, in <module>
    k3
  File "/usr/local/lib/python3.7/site-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py", line 385, in minimize
    loss, var_list=var_list, grad_loss=grad_loss, tape=tape)
  File "/usr/local/lib/python3.7/site-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py", line 440, in _compute_gradients
    raise ValueError("`tape` is required when a `Tensor` loss is passed.")
ValueError: `tape` is required when a `Tensor` loss is passed.

如果 loss 是 float 类型,那么为什么 Tensorflow 会说通过了 Tensor loss?

【问题讨论】:

  • 您能否解释一下您到底想要做什么,并分享完整的可重现代码,以便我们可以帮助您。谢谢!

标签: python numpy tensorflow


【解决方案1】:

为了社区的利益,回答@nikitamaia 的here 的解决方案。

您看到的错误消息是here in the source code

if not callable(loss) and tape is None:
    raise ValueError("`tape` is required when a `Tensor` loss is passed.")

这个错误信息似乎只出现在 tf-nightly 中,如果您在 TF 2.3 中运行代码,您会注意到一条略有不同的错误信息 TypeError: 'float' object is not callable这也许是一个更明确的信息。无论哪种方式,由于您传递的是标量损失值,而不是可调用的,因此预计会出现错误。如果您想使用标量损失值而不传递可调用对象,则应使用 GradientTape,如错误消息中所述。

【讨论】:

    【解决方案2】:

    示例代码。

    如果损失是张量,则需要添加以下内容:

    with tf.control_dependencies(gen_updates):
      d_train_opt = tf.optimizers.Adam(
        learning_rate=LR_D, 
        beta_1=BETA1
      ).minimize(
          d_loss, 
          var_list=d_vars
        )
      
    
    with tf.control_dependencies(gen_updates):
      d_train_opt = tf.optimizers.Adam(
        learning_rate=LR_D, 
        beta_1=BETA1
      ).minimize(
          d_loss, 
          var_list=d_vars,
          tape=tf.GradientTape(persistent=False)
        )
      
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-01
      • 2017-08-21
      • 2018-12-07
      • 2018-06-06
      • 1970-01-01
      • 2018-12-16
      • 2017-11-07
      • 1970-01-01
      相关资源
      最近更新 更多