深度学习pycharm debug
深度学习中,Debug 是定位并解决代码逻辑错误(如张量维度不匹配)、训练异常(如 Loss 波动)、数据问题(如标签错误)的关键手段,通过打印维度、可视化梯度等方法确保模型正常运行、优化性能,贯穿开发全流程。
直接上实例以经典错误shape报错为例:
import torch
import torch.nn as nn
import torch.nn.functional as F# 模拟图像数据
x = torch.randn(8, 3, 64, 64) # [B, C, H, W],batch size = 8# 模拟标签(分类任务)
labels = torch.randint(0, 5, (8,)) # 5 类问题,标签是 [8]# 模型定义
class BuggyNet(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)self.pool = nn.AdaptiveAvgPool2d((4, 4)) # 变成 [B, 32, 4, 4]self.linear = nn.Linear(32, 5) # ❌ 故意设置错误 in_featuresdef forward(self, x):x = F.relu(self.conv1(x)) # [B, 16, 64, 64]x = F.relu(self.conv2(x)) # [B, 32, 64, 64]x = self.pool(x) # [B, 32, 4, 4]x = self.linear(x) # ❌ 错误! x 是 4D,Linear 接受 2D 或 3Dreturn xmodel = BuggyNet()
criterion = nn.CrossEntropyLoss()# 前向传播
outputs = model(x) # 会报错
loss = criterion(outputs, labels) # 不会执行到这里
首先设置断点:
然后进行debug右击:
然后会出现控制台:
会出现变量和变量的信息(shape,值):
然后我们进行单步:
然后变量开始变化,当单步到24行时:
此刻x的shape是(8,32,4,4)但是在这个linear层
self.linear = nn.Linear(32, 5) # ❌ 故意设置错误 in_features
期望输入是32,不仅维度不相同channel也不相同,所以继续单步会报错:
RuntimeError: mat1 and mat2 shapes cannot be multiplied (1024x4 and 32x5)
然后我们根据错误进行操作将x展平并且修改linear的输入:
x = x.view(x.size(0), -1) # [8, 32*4*4] = [8, 512]
self.linear = nn.Linear(512, 5) # ✅ 修复后的定义
import torch
import torch.nn as nn
import torch.nn.functional as F# 模拟图像数据
x = torch.randn(8, 3, 64, 64) # [B, C, H, W],batch size = 8# 模拟标签(分类任务)
labels = torch.randint(0, 5, (8,)) # 5 类问题,标签是 [8]# 模型定义
class BuggyNet(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)self.pool = nn.AdaptiveAvgPool2d((4, 4)) # 变成 [B, 32, 4, 4]self.linear = nn.Linear(512, 5) # 此处修改def forward(self, x):x = F.relu(self.conv1(x)) # [B, 16, 64, 64]x = F.relu(self.conv2(x)) # [B, 32, 64, 64]x = self.pool(x) # [B, 32, 4, 4]x = x.view(x.size(0), -1) # 此处修改x = self.linear(x) return xmodel = BuggyNet()
criterion = nn.CrossEntropyLoss()# 前向传播
outputs = model(x)
loss = criterion(outputs, labels)
然后我们这样就不会报错了。
很多时候缝合模块时就是经常遇见shape问题,耐性一点关注输入输出shape这样就可以轻松解决问题。