Tensorflow PyTorch vs Keras中的二元交叉熵

Tensorflow PyTorch vs Keras中的二元交叉熵,tensorflow,pytorch,multilabel-classification,Tensorflow,Pytorch,Multilabel Classification,我正试图从皮托克的凯拉斯那里重建一个模型。两者都使用MobileNet v2,属于多类多标签问题。所以我用二元交叉熵优化模型。在Keras中,这是通过model.compile(…,loss='binary\u crossentropy',…)实现的,在PyTorch中,我用torch.nn.BCEWithLogitsLoss()实现了同样的功能。我向PyTorch模型发送logits而不是sigmoid激活的输出。尽管两个模型在损失方面非常相似(两个损失在10个时代后都下降到0.05),PyT

我正试图从皮托克的凯拉斯那里重建一个模型。两者都使用MobileNet v2,属于多类多标签问题。所以我用二元交叉熵优化模型。在Keras中,这是通过
model.compile(…,loss='binary\u crossentropy',…)
实现的,在PyTorch中,我用
torch.nn.BCEWithLogitsLoss()实现了同样的功能。我向PyTorch模型发送logits而不是sigmoid激活的输出。尽管两个模型在损失方面非常相似(两个损失在10个时代后都下降到0.05),PyTorch模型的输出并没有给出很好的预测。这意味着PyTorch的预测没有Keras模型那么可靠。研究这一点,我意识到Keras模型在正标签索引处有一个非常stron logit,然而PyTorch模型在正标签索引处的logit非常小;因此,乙状结肠没有那么强壮。例如,对于可分为54类的特定样本,输出为:

output = 
tensor([[-1.2380, -2.3283, -2.3025, -2.1275, -2.1020, -2.3684, -3.4669, -3.4503,
         -2.1905, -1.8565, -3.4215, -3.5318, -3.5715, -4.3836, -4.5215, -6.2270,
         -3.8660, -3.7280, -4.6043, -4.7601, -9.5219, -9.4969, -9.4392, -8.0596,
         -6.0773, -5.7972, -4.2495, -4.4533, -4.2641, -4.1068, -4.9987, -4.9321,
         -7.9726, -7.4475, -4.8016, -5.6634, -6.3762, -6.0103, -6.7561, -3.3259,
         -3.8778, -6.7682, -6.5663, -4.0945, -3.0747, -5.5408, -5.6429, -5.9659,
         -5.8574, -7.6435, -7.8895, -6.6514, -6.5506, -5.0583]],
       device='cuda:0')
目标是:

target = 
tensor([[0., 0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.,
             0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
             0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0., 0., 0., 0.]])
你可以看到为什么损失仍然很低。由于PyTorch的大多数模型输出为负值,且
减少=平均值
,因此它产生的损失非常小,而预测值却不大

以下是我在改进PyTorch模型时尝试过但没有成功的方法:

  • 将缩减更改为
    reduce='sum'
  • 我也被建议使用
    pos_weight
    来表示
    torch.nn.BCEWithLogitsLoss()
    ,但是Keras中的同一模型没有使用任何
    pos_weight
    ,它仍然能生成良好的预测
  • 对于相同的输入和目标,我测试了
    'binary\u crossentropy'
    torch.nn.BCEWithLogitsLoss()
    的结果,但它们产生的损失值相同。因此,我不认为两者之间存在实现差异

  • 当你从KARAS模型移动到Py火炬时,有人有其他的建议或事情要考虑吗?

    你在推论之前把你的模型设置为评估模式吗?当你设置了<代码> POSUMBOX 时,你得到了一个好的预测吗?正如你所说,在10个时代之后,损失下降到0.05,但是你展示的样本的二进制交叉熵是0.47,你真的从训练过的模型中得到了输出吗?