如何用新数据重新训练已加载的Keras模型?训练异常求助
问题描述
我有一个已保存的Keras模型,训练时已将标签自动转换为数字(如0、1、2、3对应特定字符串)。现在模型出现误判,想用标注好的新数据微调模型(避免全量重训),但添加新数据训练后出现损失异常高、准确率始终为1.0的问题。附上数据预处理及训练代码,询问预处理步骤是否正确,寻求解决办法。
LinuxGoodData = pd.read_csv('New Data', sep=r'\s*,\s*', engine='python') LinuxGoodData['Label']= label_encoder.fit_transform(LinuxGoodData['Label']) y = LinuxGoodData[['Label']] x = pd.get_dummies(LinuxGoodData.drop(['Label', ], axis = 1)) #sc = MinMaxScaler() sc = joblib.load('scaler_transform2023.joblib') x = sc.fit_transform(x) x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=42) model = keras.models.load_model("mymodel.h5") model.fit(x_train, y_train, epochs=10, batch_size=250, verbose=1) model.save("mymodel2.h5") saved_model = keras.models.load_model("mymodel2.h5")
训练输出异常表现:损失值极高,训练准确率固定为1.0。
问题根源与修正方案
你的预处理步骤存在3个关键错误,直接导致了训练异常:
1. 标签编码映射错位
原模型训练时用的是旧的LabelEncoder,你现在对新数据重新调用fit_transform,会生成全新的标签映射关系,和原模型的标签对应完全错位。比如原模型中"正常"对应0,新编码可能把"异常"映射成0,模型完全无法理解新标签,自然输出混乱。
修正:
加载原训练时保存的LabelEncoder,仅用transform转换新数据标签:
# 替换原标签编码代码 label_encoder = joblib.load('原训练用的label_encoder.joblib') LinuxGoodData['Label'] = label_encoder.transform(LinuxGoodData['Label'])
2. 特征缩放规则被覆盖
加载旧的MinMaxScaler后,你调用了fit_transform,这会重新计算新数据的均值、极值,覆盖掉原模型训练时的缩放规则。特征分布和原模型预期不一致,模型无法有效学习。
修正:
只用transform对新数据做缩放,严格沿用原缩放器的规则:
# 替换特征缩放代码 x = sc.transform(x)
3. 微调参数设置不合理
直接调用fit会默认更新所有层的权重,但原模型已经收敛,新数据量通常较小,容易出现严重过拟合(准确率1.0就是典型表现)。另外,原模型的损失函数如果是针对多分类的sparse_categorical_crossentropy,但标签是二维数组(你的y是[['Label']]),也会导致损失计算异常。
修正:
- 冻结原模型的底层特征提取层,只训练顶层分类层:
model = keras.models.load_model("mymodel.h5") # 冻结所有层,再解冻顶层分类层 for layer in model.layers[:-1]: layer.trainable = False # 必须重新编译模型,冻结设置才会生效 model.compile(optimizer=keras.optimizers.Adam(learning_rate=1e-5), loss='sparse_categorical_crossentropy', metrics=['accuracy'])
- 把标签转为一维数组,适配损失函数要求:
y = LinuxGoodData['Label'].values # 一维数组,匹配sparse_categorical_crossentropy的输入格式
完整修正后的流程
- 加载原训练时保存的
LabelEncoder和MinMaxScaler - 用
transform处理新数据的标签和特征 - 冻结原模型底层,重新编译后微调
- 训练时监控验证集表现,避免过拟合
内容的提问来源于stack exchange,提问作者babypuncher666
相关产品推荐
相关产品推荐

