我正在尝试模仿喀拉拉邦的pytorch神经网络。
我确信我的神经网络的keras版本非常接近pytorch中的版本,但是在训练过程中,我发现pytorch网络的损耗值远低于keras网络的损耗值。我想知道这是因为我没有在keras中正确复制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
附近。在喀拉拉邦,它开始于30左右,然后减少到2.5
。
答案 0 :(得分:4)
PyTorch CrossEntropyLoss
接受每个类别的非规范化分数,即不接受概率(source)。 Keras categorical_crossentropy
默认使用from_logits=False
,这意味着它假设y_pred
包含概率(不是原始分数)(source)。
在PyTorch中,如果您使用CrossEntropyLoss
,则不应在最后使用softmax / Sigmoid层。在keras中,您可以使用它,也可以不使用它,但可以设置from_logits
。
答案 1 :(得分:2)
在我的案例中,两个模型中显示的损失不同的原因是,Keras打印了带有正则化项的交叉熵损失之和,而在pytorch模型中,仅打印了分类交叉熵。