Tensorflow 在损失函数中包含一些没有地面真值的样本,通过正则化进行训练,但不直接进行训练

Tensorflow 在损失函数中包含一些没有地面真值的样本,通过正则化进行训练,但不直接进行训练,tensorflow,machine-learning,keras,neural-network,Tensorflow,Machine Learning,Keras,Neural Network,深度学习文献通常假设所有的培训数据都有与之相关的基本事实(GT),但在我正在进行的项目中,我有许多(实验性)例子没有。然而,我认为,将他们纳入培训可能非常有用,因为他们在网络的正规化部分做出了贡献,帮助网络变得更强大/更具普遍性。这主要是因为它们是极端但有效的情况,它们在输入神经网络时的行为是重要的信息 我使用的是Tensorflow 2/Keras。这是一个回归问题,所以让我们假设我使用一个类似MSE的损失函数 我想知道在model.compile(loss=my\u loss)中的my\u

深度学习文献通常假设所有的培训数据都有与之相关的基本事实(GT),但在我正在进行的项目中,我有许多(实验性)例子没有。然而,我认为,将他们纳入培训可能非常有用,因为他们在网络的正规化部分做出了贡献,帮助网络变得更强大/更具普遍性。这主要是因为它们是极端但有效的情况,它们在输入神经网络时的行为是重要的信息

我使用的是Tensorflow 2/Keras。这是一个回归问题,所以让我们假设我使用一个类似MSE的损失函数

我想知道在
model.compile(loss=my\u loss)
中的
my\u loss
损失函数中将这些情况的贡献归零的有效方法是什么,同时允许任何层中的
activity\u regularizer
的贡献成为“全局”损失函数的一部分

我曾考虑添加一个权重向量作为输入,其中每个样本都会被标记,如果它有GT或没有GT,那么将这些示例的损失计算为乘以零似乎是浪费,尽管这可能比过滤掉它们更有效


我想知道是否有其他人遇到过类似的情况,他们实施了什么样的解决方案。

这听起来更像是一个半监督学习问题。此外,我不知道“但他们在正规化方面会非常出色”的想法是否真的正确;然而,就执行而言,这是可能的

例如,假设您的模型是一个二进制分类器,输出层为1个单位的sigmoid层。因此,您可以为没有标签的样本指定一个超出范围的标签(如-1),然后编写一个自定义损失函数,在计算损失时忽略它们:

将tensorflow.keras.backend导入为K
定义掩码\u缺失\u二进制\u交叉熵(y\u真,y\u pred):
#在批处理中创建真实样本的掩码。
掩码=K.cast\u to\u floatx(y\u true>=0.0)
#计算批次中每个样品的损失。
损耗=K.二进制交叉熵(y_真,y_pred)
#将没有标签的样本的贡献归零。
返回损失*掩码
#使用模型的自定义损耗。
compile(…,loss=mask\u missing\u binary\u crossentropy)
或者,一个更简单的选项是使用
fit
sample\u weight
参数提供样本权重,也就是说,对于没有标签的样本,可以使用零的样本权重(仅为它们提供一个虚拟标签),对于标签样本,可以使用1的样本权重:

model.fit(数据、标签等,样本重量=样本重量)
然而,我不能完全确定样本权重是否未考虑其他与输入相关的损失,如Keras/TF中的活动规则化。