logSoftmax(input, target)就是先softmax,然后将结果log一下,softmax的数值∈[0,1],log以后就是负无穷到0之间,这样做的好处解决softmax可能 带来的上溢出和下溢出问题,加快运算速度,提高数据稳定性 。
NLLLoss(input, target)是按照target数值(一个代表一行)将input中每行对应位置的数据取出来,去掉负号,求和,再取平均。
logSoftmax + NLLLoss就是计算交叉熵
CrossEntropyLoss(input, target) = logSoftmax +NLLLoss = log(Softmax) + NLLLoss
因此,在分类问题中,要使用CrossEntropyLoss函数计算交叉熵损失,在model中最后一层就不需要添加Softmax层了。
通过实际测试确定,CrossEntropyLoss中内置的LogSoftmax默认是按照行加和为1.
参考:
https://www.zhihu.com/question/358069078
https://blog.csdn.net/qq_22210253/article/details/85229988?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
在使用pytorch预训练模型的时候发现预训练模型的输出层没有激活函数,为了提高模型的训练效果需要自己添加。以ResNet50为例:
输出的模型为:
可以看到最后的输出层是没有激活函数的,因此我们需要队fc层进行修改:
网络模型的fc层就变成了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)