【发布时间】:2019-04-10 22:18:18
【问题描述】:
我已经在多批次的 7 个样本上训练了一个 LSTM 模型(使用 Keras 和 TF 构建),每个批次有 3 个特征,形状类似于下面的样本(下面的数字只是用于解释目的的占位符),每批次标记为 0 或 1:
数据:
[
[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
...
]
即:m个序列的批次,每个长度为7,其元素是3维向量(因此批次具有形状(m73))
目标:
[
[1]
[0]
[1]
...
]
在我的生产环境中,数据是具有 3 个特征的样本流 ([1,2,3],[1,2,3]...)。我想在每个样本到达我的模型时对其进行流式传输并获得中间概率,而无需等待整个批次 (7) - 请参阅下面的动画。
我的一个想法是用 0 填充缺失样本的批次,
[[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[1,2,3]] 但这似乎效率低下。
如果有任何帮助可以为我指明正确的方向,即以持久的方式保存 LSTM 中间状态,同时等待下一个样本并使用部分数据在特定批量大小上训练的模型进行预测,我将不胜感激。
更新,包括型号代码:
opt = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=10e-8, decay=0.001)
model = Sequential()
num_features = data.shape[2]
num_samples = data.shape[1]
first_lstm = LSTM(32, batch_input_shape=(None, num_samples, num_features),
return_sequences=True, activation='tanh')
model.add(first_lstm)
model.add(LeakyReLU())
model.add(Dropout(0.2))
model.add(LSTM(16, return_sequences=True, activation='tanh'))
model.add(Dropout(0.2))
model.add(LeakyReLU())
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer=opt,
metrics=['accuracy', keras_metrics.precision(),
keras_metrics.recall(), f1])
模型总结:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_1 (LSTM) (None, 100, 32) 6272
_________________________________________________________________
leaky_re_lu_1 (LeakyReLU) (None, 100, 32) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 100, 32) 0
_________________________________________________________________
lstm_2 (LSTM) (None, 100, 16) 3136
_________________________________________________________________
dropout_2 (Dropout) (None, 100, 16) 0
_________________________________________________________________
leaky_re_lu_2 (LeakyReLU) (None, 100, 16) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 1600) 0
_________________________________________________________________
dense_1 (Dense) (None, 1) 1601
=================================================================
Total params: 11,009
Trainable params: 11,009
Non-trainable params: 0
_________________________________________________________________
【问题讨论】:
-
@ShlomiSchwartz 我在答案的开头添加了一条注释。请阅读以确保您走在正确的轨道上。
-
@ShlomiSchwartz This 可能有助于理解差异。
-
@ShlomiSchwartz 你的训练模型是否有状态并不重要。您可以使用涉及设置
stateful=True的解决方案,通过将训练模型的权重复制到推理模型并在@DanielMöller 的答案中启用有状态。 -
您好@ShlomiSchwartz,我根据您的模型架构更新了我的答案,请看一下。
-
如果批次是较长序列的一部分,则您的模型应该是有状态的,或者您应该使用包含“整个”序列的批次。请注意,在所有情况下,模型都不会看到同一批次中序列之间的任何关系。有状态模型将一个批次连接到另一批次。我建议详细查看链接中的答案,以准确了解 keras 如何解释您的数据:stackoverflow.com/questions/38714959/understanding-keras-lstms/…
标签: python tensorflow keras lstm stateful