PyTorch中无池化层无优化器CNN的损失不下降问题求助
问题诊断与解决方案
你的模型损失始终卡在~2.3左右,这是10分类任务中随机猜测的交叉熵损失值(ln(10)≈2.3026),说明模型完全没有学到任何特征,核心问题出在参数更新机制缺失,具体问题和修复方案如下:
核心问题
- 未定义优化器:没有初始化任何优化器(如SGD、Adam),无法对模型参数进行更新
- 未执行参数更新步骤:即使计算了梯度(
loss.backward()),但没有调用optimizer.step()来更新参数 - 未清零梯度:每次迭代后梯度会累积,导致后续梯度计算混乱,必须在每次前向传播前清零梯度
修复步骤
- 初始化优化器:添加优化器定义,比如最基础的SGD
- 迭代前清零梯度:在每次计算损失前调用
optimizer.zero_grad() - 执行参数更新:取消
optimizer.step()的注释,确保梯度反向传播后更新参数 - (可选)调整全连接层参数规模:当前全连接层输入维度是
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
相关产品推荐
相关产品推荐

