python - 如何将权重应用于 Tensorflow 中的 S 形交叉熵损失函数?

标签 python tensorflow

训练数据集包含两个类 A 和 B,我们在目标标签中相应地表示为 10。输出标签数据严重偏向 0 类,它占据了大约 95% 的数据,而我们的 1 类仅占 5%。在这种情况下,我们应该如何构建我们的损失函数?

我发现 Tensorflow 有一个可以和权重一起使用的函数:

tf.losses.sigmoid_cross_entropy

weights acts as a coefficient for the loss. If a scalar is provided, then the loss is simply scaled by the given value.

听起来不错。我将权重设置为 2.0 以使损失更高并惩罚更多错误。

loss = loss_fn(targets, cell_outputs, weights=2.0, label_smoothing=0)

然而,不仅损失没有下降,反而增加了,而且数据集的最终准确度略有下降。好吧,也许我误解了它应该是 < 1.0,我尝试了一个较小的数字。这并没有改变任何东西,我得到了几乎相同的损失和准确性。 O_o

不用说,同一网络在同一数据集上训练,但损失权重为 0.3,在 Torch/PyTorch 中显着减少了高达 x10 倍的损失。

有人可以解释一下如何在 Tensorflow 中使用损失权重吗?

最佳答案

如果您使用标量(例如 2.0)缩放损失,那么基本上您是在乘以损失,因此乘以反向传播的梯度。这类似于提高学习率,但不完全相同,因为您也在改变正则化损失(例如权重衰减)的比率。

如果你的类严重偏斜,并且你想在计算损失时平衡它,那么你必须指定一个张量作为权重,如tf.losses.sigmoid_cross_entropy()的手册中所述。 :

weights: Optional Tensor whose rank is either 0, or the same rank as labels, and must be broadcastable to labels (i.e., all dimensions must be either 1, or the same as the corresponding losses dimension).

这就是让 0 类的权重张量为 1.0,1 类的权重张量可能为 10,现在“假阴性”损失将被更多地计算。

这是一门艺术,您应该在多大程度上过度重视代表性不足的阶层。如果过度,模型会崩溃,并且会一直预测权重过大的类别。

实现相同目的的替代方法是使用 tf.nn.weighted_cross_entropy_with_logits() ,它有一个用于完全相同目的的 pos_weight 参数。但它在 tf.nn 而不是 tf.losses 中,因此您必须手动将其添加到损失集合中。

通常,另一种处理此问题的方法是在抽样时任意增加代表性不足的类别的比例。然而,这也不应该过头。您也可以做这两件事。

关于python - 如何将权重应用于 Tensorflow 中的 S 形交叉熵损失函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49813386/

相关文章:

python-3.x - TensorFlow 与 PyTorch : Memory usage

python - 获取字段查询值的元组

python - Pyramid 中的表单处理

python - 来自 archive.ics 的 "Adult data set"(数据集)上的 ML...使用 KNeighborsClassifier 将无法运行

python - 如何使用 TensorFlow 计算矩阵运算?

python - 在 skflow 的 model_fn 中使用 batch_size

python - 使用 cuda 10 安装 pip tensorflow-gpu 后出错

python - 苹果 M1 : install psycopg2 package Symbol not found: _PQbackendPID

python - keras 分类和二元交叉熵

python - steps 参数如何与 tf.contrib.learn 中的样本大小相关?