Python 当张量损失通过时,需要胶带

Python 当张量损失通过时,需要胶带,python,numpy,tensorflow,Python,Numpy,Tensorflow,我有以下损失: 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"

我有以下损失:

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.
回溯(最近一次呼叫最后一次):
文件“train.py”,第277行,在
k3
文件“/usr/local/lib/python3.7/site packages/tensorflow/python/keras/optimizer\u v2/optimizer\u v2.py”,第385行
损耗,var_列表=var_列表,渐变损耗=渐变损耗,磁带=磁带)
文件“/usr/local/lib/python3.7/site packages/tensorflow/python/keras/optimizer\u v2/optimizer\u v2.py”,第440行,在计算梯度中
raise VALUERROR(“'Tensor'丢失传递时需要'tape'”)
ValueError:'tape'在传递'Tensor'丢失时是必需的。

如果损失是浮点型的,那么为什么Tensorflow说一个
Tensor
损失被传递?

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

您看到的错误消息是:

此错误消息似乎只出现在tf nightly中,如果您在tf2.3中运行代码,您将注意到一条稍有不同的错误消息
TypeError:“float”对象不可调用
,这可能是一条更清晰的消息。无论哪种方式,由于传递的是标量损失值,而不是可调用的值,因此预期会出现错误。如果要使用标量丢失值而不传递可调用值,则应使用GradientTape,如错误消息中所述。

示例代码

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

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