神经网络回归训练损失上升及10折交叉验证实现相关问题咨询
问题解答
问题1:当前的回归实现方式是否正确?
现有实现存在多处明显问题,也是你损失上升的核心原因:
- 模型类定义语法错误:
RegressionNet的forward方法缩进错误,当前不属于类成员,调用时会直接报错,需要把forward函数整体缩进一级,放到类作用域下和__init__同级。 - K折交叉验证未开启打乱:
KFold没有设置shuffle=True,如果你的数据集是按规则排序的,会导致训练集和测试集分布差异极大,训练过程极易不稳定。 - 训练轮次不足:
num_epochs仅设置为1,模型还没完成拟合就停止训练,无法得到稳定的收敛结果。 - 单样本训练波动大:当前遍历
TensorDataset默认每次取单个样本,相当于批量大小为1的随机梯度下降,参数更新波动极大,很容易出现损失反向上升的情况。 - 超参数配置可能不合理:SGD学习率
1e-5过小会导致收敛极慢,过大则会导致参数更新步长超过最优值,损失震荡上升,需要根据你的数据规模调参。 - 全局变量风险:
size_input、size_hidden、size_output等参数作为全局变量传入模型类,不同fold输入维度变化时会出现不可预期的错误,建议改为类初始化参数传入。
问题2:训练时如何批量传入数据,而非每次仅传入单个样本?
使用PyTorch官方的DataLoader工具封装数据集即可,示例修改如下:
from torch.utils.data import DataLoader # 在fit_reg函数内,定义数据集后添加 batch_size = 32 # 可根据你的显存和数据规模调整 train_loader = DataLoader(train_ds, batch_size=batch_size, shuffle=True) # 训练时遍历DataLoader而非直接遍历Dataset for xb, yb in train_loader: pred = model(xb.float()) loss = loss_fn(pred, yb.float()) loss.backward() opt.step() opt.zero_grad()
DataLoader会自动按你指定的batch_size拆分数据集,每次返回一批样本参与计算,能大幅降低参数更新的波动,提升训练稳定性。
问题3:完成指定轮次的训练后,用全部训练样本计算得到的损失作为训练损失,该方式是否正确?
这个计算方式本身是正确的:
- 全训练集损失能准确反映模型在整个训练集上的平均拟合程度,不会因为采样偏差导致损失统计不准。
- 建议同步计算测试集的损失,对比训练/测试损失的差异,能及时发现过拟合问题。
- 如果你需要观察每一轮的训练损失变化,也可以在训练迭代过程中累计每批的损失,最后取平均,和全量计算的结果差异极小,还能节省全量前向计算的开销。
内容的提问来源于stack exchange,提问作者Kadaj13
相关产品推荐
相关产品推荐

