我正在尝试在 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/