我已经在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]]
...
]
Run Code Online (Sandbox Code Playgroud)
即:m个序列的批次,每个长度为7,其元素是三维向量(因此批次具有形状(m*7*3))
目标:
[
[1]
[0]
[1]
...
]
Run Code Online (Sandbox Code Playgroud)
在我的生产环境中,数据是具有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])
Run Code Online (Sandbox Code Playgroud)
型号摘要:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_1 (LSTM) …Run Code Online (Sandbox Code Playgroud)