我正在测试tf.gradienttape。我写了一个有几个输出层的模型,每个层都有自己的损失,我想在那里集成gradienttape。我的问题是:是否有具体的技术如何实现几个损失的梯度作为目标?我知道一个选择是取损失的平均值。有这个必要吗?难道我不能输入一个损失列表,梯度磁带就知道哪些损失属于哪个输出层吗?
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上测试了这两个选项,它们给了我类似的结果。
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))
2条答案
按热度按时间hyrbngr71#
示例1:默认
默认选项在梯度函数中添加两个损失的梯度。
实施例2:备选案文
替代选项允许您检查生成的渐变之间的关系,从而为您提供更多的自由。
我在Tensorflow 2.5上测试了这两个选项,它们给了我类似的结果。
polhcujo2#
在TensorFlow document中:除非设置persistent=True,否则Persistent Tape只能用于计算一组渐变。
要计算多个损失,您需要多个磁带。例如:
然后应用它。