深度学习pycharm debug

深度学习中,Debug 是定位并解决代码逻辑错误(如张量维度不匹配)、训练异常(如 Loss 波动)、数据问题(如标签错误)的关键手段,通过打印维度、可视化梯度等方法确保模型正常运行、优化性能,贯穿开发全流程。

直接上实例以经典错误shape报错为例:

python 复制代码
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_features

    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 = self.linear(x)               # ❌ 错误! x 是 4D,Linear 接受 2D 或 3D
        return x

model = 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) # ✅ 修复后的定义

python 复制代码
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 x

model = BuggyNet()
criterion = nn.CrossEntropyLoss()

# 前向传播
outputs = model(x)                  
loss = criterion(outputs, labels)  

然后我们这样就不会报错了。

很多时候缝合模块时就是经常遇见shape问题,耐性一点关注输入输出shape这样就可以轻松解决问题。

相关推荐
2601_956319882 分钟前
最新量化开发卡住,先查规则和流程是否完整
人工智能·python
weixin_66822 分钟前
Cursor-superpowers插件用法
数据库·人工智能
adinnet202624 分钟前
深度拆解企业级 Agent 架构:LangGraph + 知识图谱 + 向量检索的协同设计
人工智能·架构·知识图谱
糖果店的幽灵26 分钟前
langgraph分支之 - 动态分支(Dynamic Branch)
java·前端·javascript·人工智能·langgraph
这张生成的图像能检测吗28 分钟前
(论文速读)SCNN:用于交通场景理解的空间CNN
人工智能·深度学习·目标检测·计算机视觉·道路线检测
@insist12334 分钟前
系统规划与管理师-流程评价与持续改进核心知识-终章
大数据·人工智能·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
阿虎儿35 分钟前
Dify 中的 JSON Schema 标准与实战指南
人工智能
meilindehuzi_a36 分钟前
Workflow 与 Agent 有什么区别:从 LangChain 流水线到智能体决策
前端·人工智能
SLD_Allen38 分钟前
大规模分布式AI训练基础设施
人工智能·分布式·模型训练
码农学院1 小时前
AI优化AIO技术演进史:从模板生成到多智能体协同创作
人工智能