我的模型定义如下:
## defining the model
batch_size = 1
def my_model():
input_x = Input(batch_shape=(batch_size, look_back, 4), name='input')
drop = Dropout(0.5)
lstm_1 = LSTM(100, return_sequences=True, batch_input_shape=(batch_size, look_back, 4), name='3dLSTM', stateful=True)(input_x)
lstm_1_drop = drop(lstm_1)
lstm_2 = LSTM(100, batch_input_shape=(batch_size, look_back, 4), name='2dLSTM', stateful=True)(lstm_1_drop)
lstm_2_drop = drop(lstm_2)
y1 = Dense(1, activation='relu', name='op1')(lstm_2_drop)
y2 = Dense(1, activation='relu', name='op2')(lstm_2_drop)
model = Model(inputs=input_x, outputs=[y1,y2])
model.compile(loss='mse', optimizer='adam',metrics=['mse'])
model.summary()
return model
model = my_model()
它是一个批量大小 = 1 的有状态 LSTM 模型。我的model.fit
样子是这样的:
# Train the model
history = model.fit(
x_train,
[y_11_train,y_22_train],
epochs=1,
batch_size=batch_size,
verbose=0,
shuffle=False)
model.reset_states()
我的模型运行良好并输出结果。batch_size
但是当模型处于无状态状态时,我无法像我们可以做的那样灵活地增加或改变。对于更大尺寸的数据集,模型似乎永远在训练,因为batch_size
这里只有 1。而且我们知道我们不能随机设置任何batch_size
值,stateful LSTM
因为它需要是一个可分割的因素。
我浏览了一些博客,这些博客描述了batch_size
通过使用不同的批量大小进行训练和使用Keras API 参考中的get_weights()
和函数进行预测的变化: https ://machinelearningmastery.com/use-different-batch-sizes-training-predicting-python- keras/,似乎仍然是这里使用的较少。set_weights()
batch_size
我的问题是:我们不能在有状态 LSTM 中使用像 32、64、128 这样的批量大小吗?如果是,那么我如何在上面给定的模型中实现它,如果不是,那么有什么替代方案?
寻找有价值的建议。
发布编辑
在有状态的 LSTMmodel.reset_states()
中,应该在每个 epoch 之后,因此我在每个 epoch 之后以以下方式设置状态的重置:
for i in range(100):
start = time.time()
history = model.fit(x_train, [y_11_train,y_22_train], epochs=1, batch_size=batch_size, verbose=0, shuffle=False)
model.reset_states()
print("Epoch",i, time.time()-start,"s")