回归模型无法拟合原因排查:3D旋转角度预测任务问题
任务与数据背景
我需要构建一个回归模型,输出3个数值——3D模型的三个旋转角度。所有初始模型的旋转方式一致,为每个模型生成5组随机旋转(角度范围-15到15度)的图像,颜色代表与“相机”的距离,图像尺寸为[150,150],像素值0-255,包含Top、Side、Front三个视角。
训练数据集包含30个模型,每个生成5种旋转,共150个样本,其中105个用于训练,45个用于验证。
模型与训练配置
我构建了对应的卷积神经网络模型,训练配置如下:
- 训练轮次:100个epochs
- 批次大小:batch size=40
- 优化器:Adam(初始学习率0.1,后续尝试过0.01和0.001)
- 损失函数:平均绝对误差(MAE)
- 自定义指标:真实角度与预测角度的绝对误差之和
训练与预测结果
训练过程中loss及指标始终处于稳定状态,最后几个epoch的输出如下:
Epoch 95/100 3/3 [==============================] - 4s 1s/step - loss: 6.8082 - metr: 25.7488 - val_loss: 7.8395 - val_metr: 16.2496 Epoch 96/100 3/3 [==============================] - 4s 1s/step - loss: 6.8203 - metr: 28.0160 - val_loss: 7.8005 - val_metr: 16.1032 Epoch 97/100 3/3 [==============================] - 4s 1s/step - loss: 6.7898 - metr: 21.8611 - val_loss: 7.8166 - val_metr: 15.6580 Epoch 98/100 3/3 [==============================] - 4s 1s/step - loss: 6.7806 - metr: 18.9963 - val_loss: 7.8766 - val_metr: 15.1825 Epoch 99/100 3/3 [==============================] - 4s 1s/step - loss: 6.7973 - metr: 21.3751 - val_loss: 7.8581 - val_metr: 14.8261 Epoch 100/100 3/3 [==============================] - 4s 1s/step - loss: 6.7750 - metr: 19.1987 - val_loss: 7.8100 - val_metr: 14.2220
模型预测结果(上为预测值,下为真实角度):
[[-2.9442613 -0.54196733 2.4832273 ] [-4.1728406 -0.60556126 1.6946273 ] [-4.727777 -1.2003385 0.9080634 ] [-3.125803 0.2552796 1.7383668 ] [-5.6989026 0.5544905 1.539639 ] [-3.6019537 0.29354924 1.2323818 ]] [[ -4. -8. 2.] [-12. -7. 4.] [-13. -4. -3.] [ -7. 2. -4.] [-13. 8. -12.] [-15. -11. -11.]]
多次重建模型后,预测值始终接近固定值,无法有效拟合真实角度。尝试过在每个Conv2D层后添加SeparableConv2D、更换损失函数、调整学习率至0.01和0.001,但均无改善。请问该回归模型为何无法拟合?
1. 数据层面核心问题
(1)样本量严重不足
150个样本对于CNN回归任务来说太少,尤其是要学习3个连续角度的复杂映射关系。小样本下模型极易陷入统计偏差,直接输出训练集角度的均值来最小化损失,而非学习有效特征映射。
解决建议:至少扩充到500+样本;或对现有图像做轻量数据增强(如微调亮度、添加高斯噪声,注意不能破坏旋转角度对应的特征)。
(2)输入特征与标签相关性弱
你使用的距离编码颜色图像,可能存在小角度旋转(-15~15度)下视觉特征变化极细微的问题,不同角度对应的图像特征重叠度极高,模型无法区分。
解决建议:
- 可视化不同旋转角度的图像差异,确认是否存在可区分的特征;
- 改用深度图的梯度、边缘特征作为输入,或把三个视角的图像拼接成多通道输入,强化特征维度。
(3)标签分布引导模型输出均值
从预测结果看,模型输出的固定值大概率是训练集角度的均值。如果训练集角度分布不均匀,MAE损失会引导模型输出均值来最小化整体误差。
解决建议:统计训练集三个角度的均值,对比预测值是否吻合;若分布不均,重新生成覆盖-15~15度区间的均匀分布旋转样本。
2. 模型结构适配问题
(1)模型容量不匹配
如果CNN结构过于简单,无法捕捉复杂的视觉特征;若结构过复杂,小样本下又会过拟合(你的情况更偏向欠拟合,即容量不足)。另外,回归任务的输出层必须用线性激活,否则会限制输出范围。
解决建议:
- 调整模型容量:增加Conv2D的通道数,或添加1-2个全连接层;
- 确保输出层为
Dense(3, activation='linear')。
(2)特征提取方向偏差
如果模型的特征提取模块关注的是背景、噪声等无关特征,而非3D模型旋转带来的结构变化(如边缘位置、对称结构偏移),就无法拟合角度。
解决建议:
- 用Grad-CAM等工具可视化模型关注的图像区域,确认是否聚焦在3D模型主体上;
- 尝试迁移学习,用预训练的CNN(如ResNet50)作为特征提取器,利用通用视觉特征提升性能。
3. 训练配置优化不足
(1)学习率调整不到位
初始学习率0.1过大,会导致模型在训练初期就跳过最优解区域,后续调整到0.01、0.001也难以恢复。固定学习率也无法适配训练后期的收敛需求。
解决建议:
- 从极小学习率(如1e-5)开始尝试,配合学习率衰减策略(如ReduceLROnPlateau);
- 尝试SGD优化器,在小样本回归任务中有时比Adam更稳定。
(2)损失函数选择的局限性
MAE在小样本下容易引导模型输出均值,因为均值能最小化整体绝对误差。可以尝试MSE(对偏离大的样本惩罚更重)或Huber损失(结合MAE和MSE的优点)。
内容的提问来源于stack exchange,提问作者DemO-O-On

