报错不是最后一句话
运行失败时,我会先读 Traceback 的最后一个异常,再向上寻找第一个属于自己代码的调用位置。这样做的目的不是立刻“修好全部问题”,而是先确认:究竟是哪一层先失败了。
先做最小复现
面对模型训练问题,比起反复运行完整训练,我更愿意先保留一个批次,检查输入形状、设备和一次前向传播。最小复现越小,环境问题、数据问题和模型结构问题就越容易分开。
images, labels = next(iter(train_loader))
images = images.to(device)
output = model(images)
print(images.shape, output.shape)
一次只验证一个判断
调试不是同时改五处代码,然后期待错误消失。每次修改都应该对应一个明确判断:路径是否正确、张量维度是否匹配、依赖是否成功导入。确认之后,再进入下一层。
这套方法并不保证第一次就找到答案,但它会让每一步都留下证据。