如何使用Keras使用批量输入进行训练,但是使用LSTM的单个示例进行预测?

时间:2017-04-12 02:34:08

标签: python neural-network keras lstm

我有一份培训数据列表,我正在用它来训练。但是,当我预测时,预测将一次只用一个例子在线完成。

如果我使用以下

之类的输入声明我的模型
model = Sequential()
model.add(Dense(64, batch_input_shape=(100, 5, 1), activation='tanh'))
model.add(LSTM(32, stateful=True))
model.add(Dense(1, activation='linear'))
optimizer = SGD(lr=0.0005)
model.compile(loss='mean_squared_error', optimizer=optimizer)

当我使用单个形状示例(1,5,1)进行预测时,会出现以下错误。

ValueError: Shape mismatch: x has 100 rows but z has 1 rows

我提出的解决方案是使用(1,5,1)的batch_input_shape迭代地训练我的模型,并为每个单独的示例调用fit。这非常慢。

是否没有办法训练大批量,但使用LSTM预测一个例子?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

尝试这样的事情:

model2 = Sequential()
model2.add(Dense(64, batch_input_shape=(1, 5, 1), activation='tanh')) 
model2.add(LSTM(32, stateful=True))
model2.add(Dense(1, activation='linear'))
optimizer2 = SGD(lr=0.0005)
model2.compile(loss='mean_squared_error', optimizer=optimizer)

for nb, layer in enumerate(model.layers):
    model2.layers[nb].set_weights(layer.get_weights())

您只需将权重从一个模型重写为另一个模型。

答案 1 :(得分:0)

您已在第一层中定义了input_shape。因此,发送与预设编辑input_shape不匹配的形状有效。

实现这一目标有两种方法: 您可以通过更改来修改模型 batch_input_shape=(100, 5, 1)input_shape=(5, 1)以避免预设的批量大小。您可以在batch_size=100中设置model.fit()

编辑:方法2

您定义与model2完全相同的模型。然后是model2.set_weights(model1.get_weights())

如果您想使用stateful==True,您实际上想要使用最后一批中的隐藏图层作为下一批次的初始状态。因此应该匹配非常大的批量大小。否则,您只需删除stateful==True