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

PyTorch中无池化层无优化器CNN的损失不下降问题求助

问题诊断与解决方案

你的模型损失始终卡在~2.3左右,这是10分类任务中随机猜测的交叉熵损失值(ln(10)≈2.3026),说明模型完全没有学到任何特征,核心问题出在参数更新机制缺失,具体问题和修复方案如下:

核心问题

  • 未定义优化器:没有初始化任何优化器(如SGD、Adam),无法对模型参数进行更新
  • 未执行参数更新步骤:即使计算了梯度(loss.backward()),但没有调用optimizer.step()来更新参数
  • 未清零梯度:每次迭代后梯度会累积,导致后续梯度计算混乱,必须在每次前向传播前清零梯度

修复步骤

  1. 初始化优化器:添加优化器定义,比如最基础的SGD
  2. 迭代前清零梯度:在每次计算损失前调用optimizer.zero_grad()
  3. 执行参数更新:取消optimizer.step()的注释,确保梯度反向传播后更新参数
  4. (可选)调整全连接层参数规模:当前全连接层输入维度是64*32*32=65536,参数过多容易导致过拟合或训练缓慢,可考虑添加Dropout层缓解,但这不是当前损失不下降的核心原因

修改后的完整代码

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import DataLoader
from torchvision.datasets import SVHN
from torchvision.transforms import ToTensor

# 补充SVHN数据集加载示例(假设你未定义trainloader)
trainset = SVHN(root='./data', split='train', download=True, transform=ToTensor())
trainloader = DataLoader(trainset, batch_size=64, shuffle=True, num_workers=2)

class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.conv1 = nn.Conv2d(3, 32,kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.fc1 = nn.Sequential(
          nn.Flatten(),
          nn.Linear(64*32*32, 10)
        )

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.relu(self.conv2(x))
        x = self.fc1(x)
        return x

net = Net()
criterion = nn.CrossEntropyLoss()
# 初始化优化器
optimizer = torch.optim.SGD(net.parameters(), lr=0.01)

for epoch in range(10):
    net.train()
    running_loss = 0.0

    for i, data in enumerate(trainloader, 0):
        inputs, labels = data

        # 清零梯度
        optimizer.zero_grad()
        
        # 前向传播 + 计算损失 + 反向传播 + 参数更新
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 50 == 0:
            print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 50 :.3f}')
            running_loss = 0.0

print('Finished Training')

额外建议

  • 调整学习率:如果SGD学习率0.01效果不佳,可尝试0.001或使用Adam优化器(torch.optim.Adam(net.parameters(), lr=0.001))
  • 数据预处理:给SVHN添加标准化(如transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))),稳定训练过程
  • 监控准确率:除了损失,建议添加训练准确率计算,更直观观察模型学习情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:45:19