Keras LSTM保存后继续训练

时间:2018-05-09 12:07:46

标签: python tensorflow keras

我正在研究一种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')

当重新训练设置为1时,第一个数据集大约有10 000个条目,大约3k纪元和5%批量大小。 第二个数据集是单个条目数据。在一行中,再次使用3k epochs和batch_size = 1

解决

我错误地重新加载了缩放器:

scaler = joblib.load('scaler.{}.data'.format(interval))
dataset = scaler.fit_transform(dataset)

正确:

scaler = joblib.load('scaler.{}.data'.format(interval))
dataset = scaler.transform(dataset)

fit_transform重新计算缩放值的乘数,这意味着原始数据会有偏移量。

1 个答案:

答案 0 :(得分:0)

来自model.fit()的功能keras model api

  

initial_epoch:整数。开始训练的时期(对恢复之前的训练有用)。

设置此参数可能会解决您的问题。

我认为问题的根源是亚当的自适应学习率。在训练期间,学习率会因为模型的更精细化而逐渐下降。当您仅使用一个样本重新训练模型时,重量更新太大(因为重置的学习速率),这可能完全破坏您以前的重量。

如果initial_epoch不好,那么尝试以较低的学习率开始第二次训练。