pytorch: NLLLoss ignore_index 默认值

pytorch: NLLLoss ignore_index default value

在pytorch NLLLoss doc中默认的ignore_index是-100而不是通常的None,有什么特别的原因吗?似乎任何负值都是等价的。

顺便说一句,我想忽略索引的原因可能是什么?谢谢!

ignore_index 的值必须是 int,这就是为什么默认值是 int 而不是 None。默认值是任意的,它可以是任何负数,任何不是“有效”class标签的东西。该函数将忽略目标实例具有该 class 标签的所有元素。在实践中,此选项可用于识别未标记的像素,例如在密集预测任务中。


编辑:追溯nn.NLLLoss, we can find this comment in the nll_loss implementation of torch/onnx/symbolic_opset12.py的实现:

# in onnx NegativeLogLikelihoodLoss specification, ignore_index is optional without default value.
# therefore we need to set ignore_index attribute even if it is not specified (e.g. ignore_index=-100).
ignore_index = sym_help._maybe_get_const(ignore_index, "i")

我觉得他们应该默认使用None。 Python 不是静态类型的,因此 ignore_index 不需要成为 int (现在甚至像 C++ 这样的静态类型语言也有选项类型)失败那,他们本可以使用 -1,这不那么刺耳。

那么他们为什么不至少使用 -1

一种可能是作者担心-1会被误解为“最后一个”。我能够发现 -100 是从 Lua 版本的 Torch 继承而来的。虽然在Lua中,-1一般不表示“最后”,Lua火炬的Tensorclassused this convention.