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火炬的Tensor
classused this convention.
在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火炬的Tensor
classused this convention.