Python 多任务学习:训练一个神经网络,使其对这两个类具有不同的损失函数?

Python 多任务学习:训练一个神经网络,使其对这两个类具有不同的损失函数?,python,tensorflow,keras,Python,Tensorflow,Keras,我有一个有两个损失函数的神经网络,一个是两类的二进制交叉熵,另一个是回归。现在我希望回归损失只对类_2进行评估,对类_1返回0,因为回归特征对类_1没有意义 我如何在Keras中实现这样的算法 仅在class_1数据上单独训练它不起作用,因为我会丢失数据。有更多更优雅的方法来定义数据集的一半为0,而 MySuthSuffelySuff另一半。 < P>这是一个在多任务学习中非常重要的问题,其中有多个损失函数,中间共享的神经网络结构,以及可能并非对所有损失函数都有效的输入 您可以为每个损失函数传入

我有一个有两个损失函数的神经网络,一个是两类的二进制交叉熵,另一个是回归。现在我希望回归损失只对类_2进行评估,对类_1返回0,因为回归特征对类_1没有意义

我如何在Keras中实现这样的算法


仅在class_1数据上单独训练它不起作用,因为我会丢失数据。有更多更优雅的方法来定义数据集的一半为0,而<代码> MySuthSuffelySuff另一半。

< P>这是一个在多任务学习中非常重要的问题,其中有多个损失函数,中间共享的神经网络结构,以及可能并非对所有损失函数都有效的输入

您可以为每个损失函数传入一个二进制掩码,该掩码为
1
0
,方式与传入标签相同。然后将每个损失乘以相应的掩码。
1x
的导数就是
dx
,而
0x
的导数就是
0
。最后,在适当的损失函数中调零梯度。实际上,所有优化器都是加法优化器,这意味着您要对梯度求和,添加零是一个空操作。最终损失函数应该是所有其他损失的总和

我对凯拉斯了解不多。另一个解决方案是将损失函数更改为仅使用标签:
L=cross\u entropy*(标签/(标签+1e-6))
。该项几乎为0,也几乎为1。至少离政府工作和神经网络足够近。这是我第一次真正使用它,直到我意识到它就像乘以一个掩码值数组一样简单


此问题的另一个解决方案是使用
tf.where
tf.gather\u nd
仅选择要比较的标签和输出子集,然后将该子集传递给相应的损失函数。实际上,我已经改用这种方法,而不是用遮罩乘以。但这两个工作。

< P>这是一个在多任务学习中很重要的问题,其中有多个损失函数,中间有一个共享的神经网络结构,并且对于所有的损失函数都不一定是有效的输入。 您可以为每个损失函数传入一个二进制掩码,该掩码为
1
0
,方式与传入标签相同。然后将每个损失乘以相应的掩码。
1x
的导数就是
dx
,而
0x
的导数就是
0
。最后,在适当的损失函数中调零梯度。实际上,所有优化器都是加法优化器,这意味着您要对梯度求和,添加零是一个空操作。最终损失函数应该是所有其他损失的总和

我对凯拉斯了解不多。另一个解决方案是将损失函数更改为仅使用标签:
L=cross\u entropy*(标签/(标签+1e-6))
。该项几乎为0,也几乎为1。至少离政府工作和神经网络足够近。这是我第一次真正使用它,直到我意识到它就像乘以一个掩码值数组一样简单


此问题的另一个解决方案是使用
tf.where
tf.gather\u nd
仅选择要比较的标签和输出子集,然后将该子集传递给相应的损失函数。实际上,我已经改用这种方法,而不是用遮罩乘以。但这两种方法都有效。

这应该重新打开,这是多任务学习中的一个重要问题@用户7867665,您可以传入一个二进制掩码,对于每个丢失函数,该掩码为1或0,传递方式与传入标签相同。然后将每个损失乘以相应的掩码。
1x
的导数就是
dx
,而
0x
的导数就是
0
。最后,在适当的损失函数中调零梯度。实际上,所有优化器都是加法优化器,这意味着您要对梯度求和,添加零是一个空操作。你的最终损失函数应该是所有其他损失的总和。哦,这是一个很好的解决方案!谢谢@DavidParks。我还以更具体一点的形式改写了这个问题。我不能给出一个过于简单的例子,因为这会失去重点(除非有人建议改进我的问题?)你想明确使用“多任务学习”这个术语来解决这类问题。人们可能不太熟悉它。不过,我是多任务学习的大力支持者,并在许多案例中应用了多任务学习,并发表了使用多任务学习的论文。当我第一次遇到这个问题时,我已经为这个问题困惑了好几天。哦,我明白了,我会编辑的。我无法找到“掩蔽”功能,但我只是使用了
sample\u weights
来实现您的建议。啊,我对Keras了解不多。另一种解决方案是将损失函数更改为仅使用标签:L=交叉熵*(标签/(标签+1e-6))。该项几乎为0,也几乎为1。至少离政府工作和神经网络足够近。这是我第一次实际使用它,直到我意识到它就像乘以一组掩码值一样简单。这应该重新打开,这是多任务学习中的一个重要问题@用户7867665,您可以传入一个二进制掩码,对于每个丢失函数,该掩码为1或0,传递方式与传入标签相同。然后将每个损失乘以相应的掩码。
1x
的导数就是
dx
,而
0x
的导数就是
0
。最后,在适当的损失函数中调零梯度。实际上,所有优化器都是加法优化器,这意味着