You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

神经网络回归训练损失上升及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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:54:07