You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch训练MNIST模型:Loss下降但Accuracy完全不变的问题排查

Loss下降但训练准确率始终不变

我是PyTorch新手,参照官方CIFAR10教程搭建了首个基于MNIST数据集的神经网络。训练时Loss显著下降,但准确率始终维持在0.09857142857142857完全不变。

训练代码

for epoch in range(5): # a epoch is one iteration over all the data
    
        running_loss = 0.0
        for i, data in enumerate(train_loader, 0):
            # get the inputs (this is a batch, so lists of images & labels)
            inputs, labels = data
            
            # reset the gradient
            optimizer.zero_grad()
            
            # forward + backward + optimize
            outputs = net(inputs) # forward
            loss = criterion(outputs, labels) # loss
            loss.backward() # backward
            optimizer.step() # update
            
            # print statistics
            running_loss += loss.item()
            if i % 2000 == 1999: # print every 2000 mini-batches
                print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')
                running_loss = 0.0
        
        # compute accuracy after each epoch
        correct = 0
        total = 0

        with torch.no_grad():
            for data in train_loader:
                images, labels = data
                output = net(images)
                _, predicted = torch.max(outputs.data, 1)
                total += labels.size(0)
                correct += (predicted == labels).sum().item()

        print(correct/total)

print('Training finished')

训练输出

[1,  2000] loss: 1.902
[1,  4000] loss: 1.413
[1,  6000] loss: 1.188
[1,  8000] loss: 0.844
[1, 10000] loss: 0.666
[1, 12000] loss: 0.631
[1, 14000] loss: 0.614
[1, 16000] loss: 0.534
[1, 18000] loss: 0.557
[1, 20000] loss: 0.518
[1, 22000] loss: 0.448
[1, 24000] loss: 0.450
[1, 26000] loss: 0.466
[1, 28000] loss: 0.493
[1, 30000] loss: 0.412
[1, 32000] loss: 0.404
0.09857142857142857
[2,  2000] loss: 0.442
[2,  4000] loss: 0.421
[2,  6000] loss: 0.429
[2,  8000] loss: 0.423
[2, 10000] loss: 0.411
[2, 12000] loss: 0.426
[2, 14000] loss: 0.425
[2, 16000] loss: 0.400
[2, 18000] loss: 0.430
[2, 20000] loss: 0.376
[2, 22000] loss: 0.385
[2, 24000] loss: 0.376
[2, 26000] loss: 0.388
[2, 28000] loss: 0.433
[2, 30000] loss: 0.346
[2, 32000] loss: 0.357
0.09857142857142857
[3,  2000] loss: 0.393
[3,  4000] loss: 0.356
[3,  6000] loss: 0.396
[3,  8000] loss: 0.381
[3, 10000] loss: 0.350
[3, 12000] loss: 0.368
[3, 14000] loss: 0.405
[3, 16000] loss: 0.355
[3, 18000] loss: 0.367
[3, 20000] loss: 0.355
[3, 22000] loss: 0.357
[3, 24000] loss: 0.366
[3, 26000] loss: 0.362
[3, 28000] loss: 0.393
[3, 30000] loss: 0.336
[3, 32000] loss: 0.333
0.09857142857142857
[4,  2000] loss: 0.372
[4,  4000] loss: 0.323
[4,  6000] loss: 0.362
[4,  8000] loss: 0.368
[4, 10000] loss: 0.346
[4, 12000] loss: 0.345
[4, 14000] loss: 0.381
[4, 16000] loss: 0.363
[4, 18000] loss: 0.357
[4, 20000] loss: 0.337
[4, 22000] loss: 0.363
[4, 24000] loss: 0.343
[4, 26000] loss: 0.353
[4, 28000] loss: 0.390
[4, 30000] loss: 0.298
[4, 32000] loss: 0.343
0.09857142857142857
[5,  2000] loss: 0.350
[5,  4000] loss: 0.324
[5,  6000] loss: 0.361
[5,  8000] loss: 0.350
[5, 10000] loss: 0.307
[5, 12000] loss: 0.347
[5, 14000] loss: 0.372
[5, 16000] loss: 0.347
[5, 18000] loss: 0.356
[5, 20000] loss: 0.302
[5, 22000] loss: 0.339
[5, 24000] loss: 0.345
[5, 26000] loss: 0.340
[5, 28000] loss: 0.405
[5, 30000] loss: 0.310
[5, 32000] loss: 0.352
0.09857142857142857
Training finished

问题原因

准确率计算代码里存在变量名错误:

_, predicted = torch.max(outputs.data, 1)

这里误用了训练循环中最后一个batch的outputs变量,而非当前batch的output。在整个准确率计算循环中,始终用同一个固定的输出结果做预测,导致预测结果完全不随当前batch的图像变化。MNIST有10个类别,随机猜测的准确率约为0.1,和你看到的0.09857数值吻合。

解决方法

将准确率计算中的outputs.data替换为当前batch的output.data:

_, predicted = torch.max(output.data, 1)

内容的提问来源于stack exchange,提问作者a_hayler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:31:59