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

如何用新数据重新训练已加载的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的输入格式

完整修正后的流程
  1. 加载原训练时保存的LabelEncoder和MinMaxScaler
  2. 用transform处理新数据的标签和特征
  3. 冻结原模型底层,重新编译后微调
  4. 训练时监控验证集表现,避免过拟合

内容的提问来源于stack exchange,提问作者babypuncher666

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:10:23