Keras LSTM模型保存后续训预测异常问题排查与解决
LSTM模型重新加载后预测异常(仅模仿输入)的解决方案
问题背景
我在开发一个LSTM模型,目标是保存模型后使用累积的新增数据继续训练。但遇到了一个棘手的问题:保存并重新加载模型后,模型的预测结果完全错误,只会单纯模仿输入数据。
我的模型初始化代码如下:
# create and fit the LSTM network if retrain == 1: print "Creating a newly retrained network." model = Sequential() model.add(LSTM(inputDimension, input_shape=(1, inputDimension))) model.add(Dense(inputDimension, activation='relu')) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(trainX, trainY, epochs=epochs, batch_size=batch_size, verbose=2) model.save("model.{}.h5".format(interval)) else: print "Using an existing network." model = load_model("model.{}.h5".format(interval)) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(trainX, trainY, epochs=epochs, batch_size=batch_size, verbose=2) model.save("model.{}.h5".format(interval)) del model model = load_model("model.{}.h5".format(interval)) model.compile(loss='mean_squared_error', optimizer='adam')
训练参数说明:
- 首次训练(
retrain=1):使用约10000条数据,epochs设为3000,batch_size为数据集的5% - 后续训练:使用单条数据,epochs仍为3000,batch_size=1
问题根源与解决方法
经过排查,发现问题并非出在模型的保存/加载或训练逻辑上,而是在数据预处理阶段的scaler使用错误:
错误用法(导致预测异常)
重新加载scaler后,我错误地使用了fit_transform方法:
scaler = joblib.load('scaler.{}.data'.format(interval)) dataset = scaler.fit_transform(dataset)
正确用法
应该使用transform方法,基于已保存的scaler参数对新数据进行转换:
scaler = joblib.load('scaler.{}.data'.format(interval)) dataset = scaler.transform(dataset)
原因解释
fit_transform会重新计算数据的均值、标准差等缩放系数,这会导致新数据的缩放规则和模型训练时的原始数据不一致,产生偏移transform则严格使用保存的scaler中已有的参数进行转换,保证数据预处理的一致性,这样模型才能基于正确的数据分布进行预测和继续训练
内容的提问来源于stack exchange,提问作者Toomas-Siim Teresk
相关产品推荐
相关产品推荐

