我在一个明显代表性不足的目标类上训练一个递归的二元分类器。假设我们的目标类1代表<我们所有培训数据的1%,0级>99%. 为了惩罚模型对少数阶级的错误预测,我想在损失函数中使用权重。对于每个minibatch,我创建了一个对应的minibatch权重,其中我们的目标类获得一个权重标量>1.0和我们的多数阶级<相应地为1.0。例如,在下面的代码中,我们将2.0用于类1,将0.6用于类2。
loss_sum = 0.0
for t, o, tw in zip(self._targets_uns, self._logits_uns, self._targets_weight_uns):
# t -- targets tensor [batchsize x 1], tw -- weights tensor [batchsize x 1]
# e.g. [0, 0, 0, 0, 1, 1, 0] -- [0.5, 0.5, 0.5, 0.5, 2.0, 2.0, 0.5]
_loss = tf.losses.sigmoid_cross_entropy(t, o, weights=tw, label_smoothing=0,
scope="sigmoid_cross_entropy",
loss_collection=tf.GraphKeys.LOSSES)
loss_sum += _loss
[1.4, 0.8], [1.6, 0.4], [4.0, 0.1], [3.0, 1.0], ...
tf.losses.sigmoid_cross_entropy
功能。
重量作为损失的系数。如果提供了一个标量,那么损失只是按给定的值进行缩放。如果权重是形状张量[批量大小],则损失权重适用于每个相应的样本。
我只是把这两对颠倒过来,对0级使用更高的权重,对1级使用更低的权重:
[0.5, 2.0], [0.8, 1.3], [0.2, 1.0], ...
. 这也没有提供任何改善,除了比未加权版本稍差。