包括一些没有基本事实的样本,用于通过正则化进行训练,但不直接在损失函数中



深度学习文献通常假设所有训练数据都有与之相关的基本事实(GT(,但在我正在进行的项目中,我有许多(实验(例子没有。然而,我认为将它们纳入训练可能非常有用,因为它们在网络的正则化组件中做出了贡献,有助于网络更加稳健/可推广。这主要是因为它们是极端但有效的情况,并且它们在输入到神经网络时的行为是重要的信息。

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

我想知道什么是一种有效的方法来将这些情况在model.compile(loss=my_loss)my_loss损失函数中的贡献归零,同时允许activity_regularizer在任何层中的贡献成为"全局"损失函数的一部分。

我曾考虑添加一个权重向量作为输入,其中每个样本都被标记为是否具有GT,但计算这些样本的损失然后乘以零似乎是浪费的,尽管这可能比过滤它们更有效。

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

这听起来更像是一个半监督的学习问题。此外,我不知道"……但他们在正则化方面会很出色"的想法是否真的正确;然而,就实现而言,这是可能的。

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

import tensorflow.keras.backend as K
define mask_missing_binary_crossentropy(y_true, y_pred):
# Create a mask of real samples in the batch.
mask = K.cast_to_floatx(y_true >= 0.0)
# Compute the loss for each sample in the batch.
loss = K.binary_crossentropy(y_true, y_pred)
# Zero-out the contribution of samples with no labels.
return loss * mask
# Use the custom loss for the model.
model.compile(..., loss=mask_missing_binary_crossentropy)

或者,一个更简单的选项是使用fitsample_weight自变量提供样本权重,即您可以对没有标签的样本使用零的样本权重(只为它们提供一个伪标签(,对标记的样本使用1的样本权重:

model.fit(data, labels, ..., sample_weight=sample_weight)

然而,我不完全确定样本权重是否没有考虑其他与输入相关的损失,如Keras/TF中的活动正则化

最新更新