python - 在 Pytorch 上使用 sigmoid 输出进行交叉熵损失

标签 python pytorch loss-function cross-entropy

我正在尝试修改 Yolo v1 以处理我的任务,其中每个对象只有 1 个类。 (例如:一个对象不能同时是猫和狗)

由于架构的原因(诸如本地化预测之类的其他输出必须使用回归),因此 sigmoid 被应用于模型的最后一个输出(f.sigmoid(nearly_last_output))。而对于分类,yolo 1 也使用 MSE 作为损失。但据我所知,与我想要的 one-hot 的交叉熵相比,MSE 有时表现不佳。

具体的:GT是这样的:0 0 0 0 1(假设我们总共只有5个类,每个类只有1个类,所以其中只有一个数字1,当然这是本例中为第 5 类)

分类部分的输出模型:0.1 0.1 0.9 0.2 0.1

我发现一些建议使用 nn.BCE/nn.BCEWithLogitsLoss 但我认为我应该在这里要求更正确的信息,因为我不擅长数学,也许我有些地方错了,所以只是要求了解更多信息,并确定我应该正确使用什么?

最佳答案

  1. MSE损失通常用于回归问题。

  2. 对于二元分类,您可以使用 BCEBCEWithLogitsLossBCEWithLogitsLoss 将 sigmoid 和 BCE loss 结合起来,因此如果最后一层应用了 sigmoid,则可以直接使用 BCE

  3. 您的案例中提到的 GT 指的是“多类”分类问题,并且显示的输出并不真正对应于多类分类。因此,在这种情况下,您可以应用 CrossEntropyLoss,它结合了 softmax 和对数损失,适合“多类”分类问题。

关于python - 在 Pytorch 上使用 sigmoid 输出进行交叉熵损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63914849/

相关文章:

tensorflow - 经过一段时间的训练后,训练损失值正在增加,但模型检测物体的效果相当好

machine-learning - Keras 中的自定义损失函数用于惩罚漏报

python - 减速板错误 : urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate

具有频率的 Ngram 的 Python 列表

python - 导入错误 : cannot import name 'mobilenet_v2' from 'torchvision.models'

python - 将循环层附加到具有不同隐藏大小的 PyTorch LSTM 模型

python - 如何在 Django ModelAdmin 中创建和保存动态字段?

python - Boto 使用 fabric 和 boto 在不同的 VPC 中创建启动配置

python - 使用 PyTorch 进行就地操作

python - Keras 不使用自定义损失中的导数进行训练