火炬的交叉熵损失与喀拉拉邦的“ categorical_crossentropy”不同吗?

时间:2020-04-26 08:38:58

标签: keras deep-learning neural-network pytorch

我正在尝试模仿喀拉拉邦的pytorch神经网络。

我确信我的神经网络的keras版本非常接近pytorch中的版本,但是在训练过程中,我发现pytorch网络的损耗值远低于keras网络的损耗值。我想知道这是因为我没有在keras中正确复制pytorch网络,还是两个框架中的损耗计算不同。

火炬损失定义:

loss_function = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=args.lr, momentum=0.9, weight_decay=5e-4)

Keras损失定义:

sgd = optimizers.SGD(lr=.1, momentum=0.9, nesterov=True)
resnet.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['categorical_accuracy'])

请注意,keras网络中的所有层均已通过L2正则化kernel_regularizer=regularizers.l2(5e-4)实现,我也使用了he_uniform初始化,据source code所述,我相信这是pytorch中的默认设置。

两个网络的批处理大小相同:128

在pytorch版本中,我得到的损耗值在4.1209附近,减小到0.5附近。在喀拉拉邦,它开始于30左右,然后减少到2.5

2 个答案:

答案 0 :(得分:4)

PyTorch CrossEntropyLoss接受每个类别的非规范化分数,即不接受概率(source)。 Keras categorical_crossentropy默认使用from_logits=False,这意味着它假设y_pred包含概率(不是原始分数)(source)。

在PyTorch中,如果您使用CrossEntropyLoss,则不应在最后使用softmax / Sigmoid层。在keras中,您可以使用它,也可以不使用它,但可以设置from_logits

答案 1 :(得分:2)

在我的案例中,两个模型中显示的损失不同的原因是,Keras打印了带有正则化项的交叉熵损失之和,而在pytorch模型中,仅打印了分类交叉熵。