![](/img/trans.png)
[英]Create a neural network to classify mnist dataset without using keras. Error: tape is required when a Tensor loss is passed
[英]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.