【问题标题】:How to add multiple losses into gradienttape如何在梯度带中添加多个损失
【发布时间】:2022-10-13 08:53:37
【问题描述】:

我正在测试 tf.gradienttape。我编写了一个具有多个输出层的模型,每个输出层都有自己的损失,我想在其中集成梯度带。我的问题是:是否有特定的技术如何实现以梯度为目标的几种损失? 我知道一种选择是取损失的平均值。这总是必要的吗?我不能只输入一个损失列表,而梯度带就知道哪些损失属于哪个输出层吗?

【问题讨论】:

  • 梯度带只是一种计算张量相对于另一个张量的梯度的工具,与您的模型架构无关。当您有多个损失张量时,只需将它们加在一起即可形成最终的损失张量,除非您想对同一模型中的不同损失使用不同的优化器。
  • 所以我不必取所有损失的平均值并将其用作我的最终损失,它也应该与一个具有 x 损失的最终张量一起使用?
  • 如果您使用张量作为梯度带的目标,它将计算梯度带的梯度那个张量,是的。
  • 通常损失张量的维度为(batch_size,),即损失本身是标量值(单个数字)。如果您正在谈论vector-valued loss,那么您需要定义要最小化的该向量的标量值函数。没有“最小化向量”之类的东西。
  • 我有一个强化学习 - 演员批评者方法。并且那个actor有x个密集层作为输出,每个动作1个。我为这些动作中的每一个计算一个损失,即每个输出密集层的一个损失。所以现在当调用梯度带时,我给他一个张量,每个密集层都有一个损失值。这是有效的还是我需要计算每个输出层的平均损失并将其作为第一个参数放入tape.gradient?

标签: python tensorflow gradienttape


【解决方案1】:

TensorFlow document 中:除非您设置 persistent=True,否则 GradientTape 只能用于计算一组渐变。

要计算多个损失,您需要多个磁带。就像是:

with tf.GradientTape() as t1:
    loss1_result= loss1(true, pred)
grads1 = t1.gradient(loss1_result, var_list1)
with tf.GradientTape() as t2:
    loss2_result= loss2(true, pred)
grads2 = t2.gradient(loss2_result, var_list2)

然后应用它。

opt1.apply_gradients(zip(grads1, var_list1))
opt2.apply_gradients(zip(grads2, var_list2))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 2016-11-29
    • 2020-08-25
    相关资源
    最近更新 更多