簡體   English   中英

通過張量損失時需要磁帶

[英]Tape is required when a tensor loss is passed

我有以下損失:

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

其中類型(損失)是 <class 'float'>

但是,在像這樣在優化器中使用這種損失時:

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.

如果損失是浮點類型,那么為什么 Tensorflow 說通過了Tensor損失?

為了社區的利益,@nikitamaia 從這里回答解決方案。

您看到的錯誤消息在源代碼中

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 ,如錯誤消息中所述。

示例代碼。

如果 loss 是張量,則需要添加以下內容:

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)
    )
  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM