keras - pytorch 的交叉熵损失与 keras 的 "categorical_crossentropy"不同吗?

标签 keras deep-learning neural-network 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)

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 左右.在 keras 中,它从 30 开始,然后下降到 2.5 .

最佳答案

PyTorch CrossEntropyLoss接受每个类别的非标准化分数,即不是概率( source )。 Keras categorical_crossentropy默认使用 from_logits=False这意味着它假定 y_pred包含概率(不是原始分数)( source )。
在 PyTorch 中,如果您使用 CrossEntropyLoss ,你不应该在最后使用 softmax/sigmoid 层。在 keras 中,您可以使用或不使用它,但设置 from_logits因此。

关于keras - pytorch 的交叉熵损失与 keras 的 "categorical_crossentropy"不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61437961/

相关文章:

opencv - 仅通过图像而不是通过标签从数据库中查找相似图像

python - Keras - 查找嵌入

machine-learning - Keras:如何将输入直接输入神经网络的其他隐藏层而不是第一个隐藏层?

python - 在 Keras 中制作自定义规范化层(每个功能)

python - 并行 LSTM 分别处理输入的不同部分

neural-network - 如何重用现有的神经网络来使用 TensorFlow 训练新的神经网络?

opencv - ENCOG(或任何框架)中的图像分类示例?

tensorflow - Keras 中填充输出的 F1 分数

python - 使用 PyTorch 的交叉熵损失函数是否需要 One-Hot 编码?

python - CNN 过度拟合(附输出和代码)