我正在使用 TensorFlow 训练 CNN 进行分类。在机器学习中,损失函数有几种不同的定义。一般来说,我们可以选择一种特定的损失(例如,用于二元分类的二元交叉熵损失、铰链损失、用于语义分割的 IoU 损失等)。如果我在一个问题中遭受了多次损失,例如:
loss = loss1 + loss2
这属于多任务学习还是多目标优化?我们是否应该为损失添加一些可训练的线性权重?
loss = a*loss1 + (1-a)*loss2
我正在使用 TensorFlow 训练 CNN 进行分类。在机器学习中,损失函数有几种不同的定义。一般来说,我们可以选择一种特定的损失(例如,用于二元分类的二元交叉熵损失、铰链损失、用于语义分割的 IoU 损失等)。如果我在一个问题中遭受了多次损失,例如:
loss = loss1 + loss2
这属于多任务学习还是多目标优化?我们是否应该为损失添加一些可训练的线性权重?
loss = a*loss1 + (1-a)*loss2
使用两个损失意味着您有兴趣优化它们。这可能是因为您正在执行两个不同的任务,并且您正在两个任务之间共享模型的某些部分。或者以某种方式,它可能来自于您在多目标情况下寻求优化。以下是使用多重损失的一些示例:
训练分类器并使用正则化项(例如 L1 L2 等正则化项)。在这种情况下,您有兴趣对输入进行分类,但您不希望权重变得太大。因此,您将优化两个损失的某种线性组合。(该线性组合权重将是一个超参数,您可以使用超参数调整技术来调整它,就像交叉验证一样)
训练具有输入(衣服图像)的网络,并以两种方式对其进行分类:1- 颜色 2- 大小。在这个例子中,可以认为训练两个不相交的模型会更好,但在某些情况下,共享神经网络的某些层有助于模型的泛化。在此示例中,您希望优化两个损失的总和,并且在大多数情况下都能很好地工作。(我认为没有必要添加一个超参数,因为最小化部分独立损失的总和,导致以最佳方式优化它们。)
在 Tensorflow 中进行这种优化将是小菜一碟 :)
# add both loss
final_loss = tf.add(loss1,loss2)
train_op = tf.train.AdamOptimizer().minimize(final_loss)
或者您可能喜欢:
optimizer1 = tf.train.AdamOptimizer().minimize(loss1)
optimizer2 = tf.train.AdamOptimizer().minimize(loss2)
# in training:
_, _, l1, l2 = sess.run(fetches=[optimizer1, optimizer2, loss1, loss2], feed_dict={x: batch_x, y: batch_y})
或者可能:
optimizer1 = tf.train.AdamOptimizer().minimize(loss1)
optimizer2 = tf.train.AdamOptimizer().minimize(loss2)
# in training:
_, l1 = sess.run(fetches=[optimizer1, loss1], feed_dict={x: batch_x, y: batch_y})
_, l2 = sess.run(fetches=[optimizer2, loss2], feed_dict={x: batch_x, y: batch_y})
希望对您有所帮助:)