基于传感器图像的CNN回归模型预测结果恒同问题排查求助
解决所有测试样本预测结果一致的问题
先直接点明最致命的错误,再逐一排查其他潜在问题:
1. 测试数据加载函数的致命bug
你的load_Testdata函数存在变量引用错误,导致所有测试样本加载的都是同一个图像(大概率是之前代码中遗留的imgfile变量值),这是预测结果完全一致的直接原因:
def load_Testdata(dataname): img_data_array = [] # 错误:这里误用了未定义的imgfile,应该使用传入的dataname参数 # imag = image.imread(imgfile) imag = image.imread(dataname) # 修复这一行! imag = np.array(imag) imag = imag.astype('float64') imag /= 255 img_data_array.append(imag) return img_data_array
先修复这个错误,再验证后续问题。
2. 训练轮次严重不足
从代码看你只训练了1个epoch:
history = model.fit(..., epochs=1)
即使你尝试过增加轮次,当前训练次数完全不足以让模型学习到数据中的模式。建议至少训练50-100个epoch,同时加入早停机制防止过拟合:
from tensorflow.keras.callbacks import EarlyStopping early_stop = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True) # 划分10%的训练数据作为验证集 history = model.fit( x=np.array(img_Trainingdata, np.float64), y=np.array(output_Trainingdata, np.float64), epochs=100, validation_split=0.1, callbacks=[early_stop] )
3. 模型参数过多,易引发梯度消失/过拟合
你的模型总参数接近960万,但从训练步数(36步)来看,训练样本量应该很小(假设batch_size=32,总样本仅1152个),参数数量远超样本量会导致模型难以有效学习。建议简化模型:
- 大幅减少全连接层的神经元数量,比如把
Dense(3000)改成Dense(512)或Dense(256) - 加入Dropout层抑制过拟合:
model.add(tf.keras.layers.Flatten()) model.add(tf.keras.layers.Dense(512, activation='relu')) model.add(tf.keras.layers.Dropout(0.3)) # 添加Dropout层 model.add(tf.keras.layers.Dense(101))
4. 输出数据未归一化
你对图像做了归一化(imag /=255),但待预测的踝关节力矩序列没有做任何归一化处理。如果力矩值范围较大,会导致模型损失波动剧烈,梯度更新不稳定。建议对输出数据做归一化:
# 在create_dataset之后,对输出数据做归一化 from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # 拟合训练数据并归一化 output_Trainingdata_scaled = scaler.fit_transform(np.array(output_Trainingdata)) # 训练时使用归一化后的输出 history = model.fit(x=..., y=output_Trainingdata_scaled, ...) # 预测后反归一化得到真实力矩值 pred = model.predict(...) pred = scaler.inverse_transform(pred)
5. 确认训练数据的匹配正确性
检查create_dataset中图像与对应.mat文件的匹配逻辑:
- 确认
imgfile[0:-5] + ".mat"能准确对应到标签文件,比如sample1.jpeg对应sample1.mat - 随机抽取几个样本,打印图像形状和对应输出序列的长度,确保没有错位或匹配错误
6. 验证模型输入输出形状一致性
确认输入图像的形状确实是(101,9,3),与模型input_shape一致;输出序列长度确实是101,与最后一层Dense(101)的输出维度匹配。
修复以上问题后,应该能解决预测结果一致的情况。如果仍有问题,可以观察训练损失曲线:如果损失一直不变或下降极慢,可尝试降低学习率(比如调到0.0001)或更换优化器。
内容的提问来源于stack exchange,提问作者Ozan Simon
相关产品推荐
相关产品推荐

