深度学习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这样就可以轻松解决问题。

相关推荐
SuperW3 分钟前
OPENCV重点结构体Mat的讲解
人工智能·opencv·计算机视觉
吹风看太阳3 分钟前
机器学习14-迁移学习
人工智能·机器学习·迁移学习
我是王大你是谁4 分钟前
QWEN2.5-3B 蒸馏 QWEN2.5-0.5B
人工智能·llm
課代表7 分钟前
数学知识体系难易程度表及关系
人工智能·数学·机器学习·几何·高等数学·层级·难度
机器之心17 分钟前
真实联网搜索Agent,7B媲美满血R1,华为盘古DeepDiver给出开域信息获取新解法
人工智能
新智元27 分钟前
Cursor 1.0首个大版本来袭!自动捉bug,秒改屎山代码,AI编程分水岭已至
人工智能·cursor
松树戈1 小时前
业务材料——半导体行业MES系统核心功能&工业协议&AI赋能
人工智能·制造
AI大模型知识1 小时前
构建LangChain代理以实现流程自动化示例
人工智能·llm
山顶望月川1 小时前
并行智算MaaS云平台:打造你的专属AI助手,开启智能生活新纪元
人工智能·生活
新加坡内哥谈技术1 小时前
力提示(force prompting)的新方法
人工智能