pytorch 的交叉熵损失与 keras 的“categorical_crossentropy”不同吗?

Luc*_*ucG 3 neural-network deep-learning keras pytorch

我正在尝试在 keras 中模拟 pytorch 神经网络。

我确信我的 keras 版本的神经网络与 pytorch 中的非常接近,但在训练期间,我看到 pytorch 网络的损失值远低于 keras 网络的损失值。我想知道这是不是因为我没有正确复制keras中的pytorch网络或者两个框架中的损失计算不同。

Pytorch 损失定义:

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

Keras 损失定义:

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

请注意,根据源代码,keras 网络中的所有层都已使用 L2 正则化实现kernel_regularizer=regularizers.l2(5e-4),我还使用了he_uniform我认为在 pytorch 中默认的初始化。

两个网络的批量大小相同:128.

在 pytorch 版本中,我得到了大约4.1209减少到大约 的损失值0.5。在 keras 中,它从 30 左右开始并减少到2.5.

xas*_*hru 7

PyTorchCrossEntropyLoss接受每个类别的非标准化分数,即不是概率(来源)。Kerascategorical_crossentropy默认使用from_logits=False这意味着它假定y_pred包含概率(不是原始分数)(source)。

在 PyTorch 中,如果使用CrossEntropyLoss,则不应在最后使用 softmax/sigmoid 层。在 keras 中,您可以使用或不使用它,但要相应地设置from_logits