在使用pytorch实现一个多分类任务的时候,许多多分类任务在训练过程中都会有如下的代码:
criterion = nn.CrossEntropyLoss()
loss = criterion(output, target)
# output.size : [batch_size, class_num]
# target.size : [batch_size]
许多的初学者会卡在这里,生出这样一个疑问:为什么输入的output.size和target.size是不一样的,这样如何计算损失值呢?因为根据损失函数的设计原理,损失值的计算应该如下图所示:
output应该和target的size是一一对应,才可以实现损失值的计算。
包括在官网上查看CrossEntropyLoss()函数的例子
也可以看到,依旧有size不匹配的例子。这是为什么呢?
这是因为在CrossEntropyLoss()函数的内部,会将传入的target转化为独热编码的格式,这样就会使target的size从[batch_size] =》 [batch_size, class_num]了。
故究其原因,就是CrossEntropyLoss()函数的内部会将target转化为独热编码,所以输入的时候直接将[batch_size] 的target(存放的是batch_size个对应类别标签) 输入进去即可。