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

ws51t4hk  于 2023-10-23  发布在  其他
关注(0)|答案(2)|浏览(88)

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

hyrbngr7

hyrbngr71#

示例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上测试了这两个选项,它们给了我类似的结果。

polhcujo

polhcujo2#

TensorFlow document中:除非设置persistent=True,否则Persistent Tape只能用于计算一组渐变。
要计算多个损失,您需要多个磁带。例如:

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

相关问题