如何将多个损失添加到梯度

发布于 2025-01-24 08:56:31 字数 153 浏览 5 评论 0原文

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

I am testing tf.gradienttape. I wrote a model with several output layers, each with an own loss, where i wanted to integrate the gradienttape. My question is: are there specific techniques how to implement the several losses to the gradient as target?
I know one option is to take the mean of the losses. Is that always necessary? Can't I just input a list of losses and the gradienttape knows which losses belong to which output layer?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小镇女孩 2025-01-31 08:56:31

示例1:默认值

默认选项在梯度函数中添加两个损失的梯度。

with tf.GradientTape(persistent=True) as tp:
    logits_1,logits_2=model(X_train)
    loss1= loss_fn_1(y_train_1, logits_1)
    loss2= loss_fn_2(y_train_2, logits_2)
grads = tp.gradient([loss1,loss2], model.weights)
opt.apply_gradients(zip(grads, model.weights))

示例2:替代性

替代选项通过允许您检查生成的梯度之间的关系,从而为您提供了更多的自由。

with tf.GradientTape(persistent=True) as tp:
    logits_1,logits_2=model(X_train)
    loss1= loss_fn_1(y_train_1, logits_1)
    loss2= loss_fn_2(y_train_2, logits_2)
grads_1 = tp.gradient(loss1, model.weights)
grads_2 = tp.gradient(loss2, model.weights)
grads_final = grads_1 + grads_2
opt.apply_gradients(zip(grads_final, model.weights))

我在Tensorflow 2.5上测试了这两个选项,它们给了我类似的结果。

Example 1:Default

The default option add the gradients of the two losses within the gradient function.

with tf.GradientTape(persistent=True) as tp:
    logits_1,logits_2=model(X_train)
    loss1= loss_fn_1(y_train_1, logits_1)
    loss2= loss_fn_2(y_train_2, logits_2)
grads = tp.gradient([loss1,loss2], model.weights)
opt.apply_gradients(zip(grads, model.weights))

Example 2: Alternative

The alternative options gives you more freedom by allowing you to check the relations between the generated gradients.

with tf.GradientTape(persistent=True) as tp:
    logits_1,logits_2=model(X_train)
    loss1= loss_fn_1(y_train_1, logits_1)
    loss2= loss_fn_2(y_train_2, logits_2)
grads_1 = tp.gradient(loss1, model.weights)
grads_2 = tp.gradient(loss2, model.weights)
grads_final = grads_1 + grads_2
opt.apply_gradients(zip(grads_final, model.weights))

I tested both options on Tensorflow 2.5 and they gave me similar results.

泅渡 2025-01-31 08:56:31

要计算多个损失,您需要多个磁带。类似:

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

In the TensorFlow document: Unless you set persistent=True a GradientTape can only be used to compute one set of gradients.

To calculate multiple losses, you need multiple tapes. Something like:

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)

Then apply it.

opt1.apply_gradients(zip(grads1, var_list1))
opt2.apply_gradients(zip(grads2, var_list2))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文