【问题标题】:How to train using batch inputs with Keras, but predicting with single example with an LSTM?如何使用 Keras 使用批量输入进行训练,但使用 LSTM 使用单个示例进行预测?
【发布时间】:2017-04-12 02:34:07
【问题描述】:

我有一个用于训练的训练数据列表。但是,当我进行预测时,预测将在线完成,一次只有一个示例。

如果我使用如下输入声明我的模型

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 通过单个示例进行预测?

感谢您的帮助。

【问题讨论】:

    标签: python neural-network keras lstm


    【解决方案1】:

    试试这样的:

    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())
    

    您只是将权重从一个模型改写到另一个模型。

    【讨论】:

    • 这似乎有效。我想我以前试过这个,但我是通过在模型上调用 get 和 set 来做到的,但由于某种原因它不起作用。我没有逐层尝试。谢谢!
    【解决方案2】:

    您已经在第一层定义了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

    【讨论】:

    • 我试过了。当使用 stateful=True 的 LSTM 层时,它会给出错误“如果 RNN 是有状态的,则必须提供完整的 input_shape(包括批量大小)。”
    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2017-11-06
    • 2016-06-27
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多