我正在研究一种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重新计算缩放值的乘数,这意味着原始数据会有偏移量。
答案 0 :(得分:0)
来自model.fit()的功能keras model api:
initial_epoch:整数。开始训练的时期(对恢复之前的训练有用)。
设置此参数可能会解决您的问题。
我认为问题的根源是亚当的自适应学习率。在训练期间,学习率会因为模型的更精细化而逐渐下降。当您仅使用一个样本重新训练模型时,重量更新太大(因为重置的学习速率),这可能完全破坏您以前的重量。
如果initial_epoch不好,那么尝试以较低的学习率开始第二次训练。