如何使用 Keras 使用批量输入进行训练,但使用 LSTM 使用单个示例进行预测?
How to train using batch inputs with Keras, but predicting with single example with an 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 通过单个示例进行预测?
感谢您的帮助。
您已经在第一层定义了input_shape
。因此发送与预设 input_shape
不匹配的形状是有效的。
有两种方法可以实现:
您可以通过更改来修改模型
batch_input_shape=(100, 5, 1)
到
input_shape=(5, 1)
以避免预设批量大小。您可以在 model.fit()
.
中设置 batch_size=100
编辑:方法 2
您定义的模型与 model2
完全相同。然后model2.set_weights(model1.get_weights())
。
如果你想使用stateful==True
,你实际上是想使用上一批的隐藏层作为下一批的初始状态。因此,非常批量大小应该匹配。否则,您可以删除 stateful==True
.
尝试这样的事情:
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())
您只是将权重从一个模型重写到另一个模型。
我有一个我用来训练的训练数据列表。但是,我在预测的时候,会在线上预测,一次一个样例。
如果我使用如下输入声明我的模型
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 通过单个示例进行预测?
感谢您的帮助。
您已经在第一层定义了input_shape
。因此发送与预设 input_shape
不匹配的形状是有效的。
有两种方法可以实现:
您可以通过更改来修改模型
batch_input_shape=(100, 5, 1)
到
input_shape=(5, 1)
以避免预设批量大小。您可以在 model.fit()
.
batch_size=100
编辑:方法 2
您定义的模型与 model2
完全相同。然后model2.set_weights(model1.get_weights())
。
如果你想使用stateful==True
,你实际上是想使用上一批的隐藏层作为下一批的初始状态。因此,非常批量大小应该匹配。否则,您可以删除 stateful==True
.
尝试这样的事情:
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())
您只是将权重从一个模型重写到另一个模型。