【问题标题】:is crossentropy loss of pytorch different than "categorical_crossentropy" of keras?pytorch的交叉熵损失与keras的“categorical_crossentropy”不同吗?
【发布时间】:2020-08-09 18:33:29
【问题描述】:

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

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

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 初始化,我认为这是 pytorch 中的默认值,根据 source code

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

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

【问题讨论】:

    标签: keras deep-learning neural-network pytorch


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。它回答了所提出的问题,但它认为损失计算在我的情况下是等效的。你知道为什么一个明显相似的网络会给出更高的损失值吗?
    • 您会注意到差异很小,但如果差异太大(0.5 与 2.5),则说明有问题。没有更多信息很难判断,但您可以验证输入网络的批次是否相同。
    • 我才意识到pytorch代码中打印的损失值只是分类交叉熵!而在 keras 代码中,它是分类交叉熵与正则化项的总和。我刚刚禁用了 keras 代码中的权重衰减,现在损失大致相同。谢谢! :)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 2018-04-14
      • 2019-11-02
      • 1970-01-01
      • 2017-06-26
      • 2020-09-24
      • 2021-01-21
      • 2020-08-13
      • 2020-12-18
      相关资源
      最近更新 更多