1. 问题定位与调试思路
作为一名长期与Python打交道的开发者,我深知调试代码时那种"明明逻辑都对但就是跑不通"的挫败感。让我们先来梳理这个线性回归案例的核心问题:
从错误描述和代码来看,主要存在两个关键问题:
- 数据批处理函数
data_provider中返回的get_label错误地引用了data而非label - 损失计算时张量形状不匹配(
batch_y.shape异常)
经验之谈:PyTorch中90%的报错都源于张量形状不匹配。养成在每个关键步骤检查
.shape的习惯能节省大量调试时间。
1.1 数据流验证
正确的数据流应该是:
原始数据生成 → 批处理分割 → 前向计算 → 损失计算 → 反向传播 → 参数更新
当前代码在批处理环节就出现了数据污染:
python复制# 错误实现
get_label = data[get_indices] # 错误地返回了特征数据
# 正确实现应为
get_label = label[get_indices]
这个错误会导致:
- 损失计算时用特征数据代替了真实标签
- 后续所有梯度计算基于错误数据
- 模型完全无法学到正确规律
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 完整调试过程实录
2.1 数据生成验证
首先验证数据生成部分是否正确:
python复制print(f"X shape: {X.shape}, Y shape: {Y.shape}")
# 应输出:X shape: torch.Size([500,4]), Y shape: torch.Size([500])
plt.figure(figsize=(10,6))
for i in range(4):
plt.scatter(X[:,i], Y, s=1, label=f'Feature {i}')
plt.legend()
plt.show()
可视化确认:
- 每个特征与标签应呈现线性关系
- 噪声幅度在合理范围(约±0.01)
2.2 批处理函数修正
重写数据加载器:
python复制def data_provider(data, label, batchsize):
length = len(label)
indices
