我想训练状态LSTM模型以进行时间序列预测。 最初,我认为我应该写:
for batch in range(len(features) - window_size):
# get arrays for the batch
fb = features[batch:batch+window_size,:]
lb = labels[batch:batch+window_size,:]
#reshape
fb = fb.reshape(1, fb.shape[0], fb.shape[1])
lb = lb.reshape(1, lb.shape[0], lb.shape[1])
# train
model.train_on_batch(fb, lb) # .fit(fb, lb, epochs=1, batch_size=window_size)
假设上面的示例采用10000个样本中的100个固定大小的窗口,并针对每次迭代(0..99、1..100、2..101等)的每次移动进行训练。在这种情况下,x和y的长度相同,为100。
此处的窗口和批次相同。但是实际上,一个窗口/批处理只有一个标签。
考虑将运动的猫视频和一个窗口表示为快照/图片的数据,可以用一个标签分类,而不是100个标签。想象这是一只猫的照片。并具有100个标签意味着必须以某种方式对每行进行标签,但是实际上这没有任何意义。一个快照可以标记为例如猫移动的距离。因此,窗口1的标签为0,窗口2-1mm等。
我在描述模型时误解了批处理定义吗?
在这种情况下正确的输入/输出形状/批量大小是什么?
编辑:引入视频是为了解释自己。现实中的数据集是天数,其中每天是10000个度量(正常世界中的样本),具有7个输入/功能和8个一键式标签。目前,train_on_batch的输入形状为(1、100、32)[32是LSTM神经元数]。
答案 0 :(得分:1)
通常使用具有3D卷积内核的卷积网络来完成视频分类。例如,请看Google和Standford研究人员的this paper。
在您的情况下,您使用的是LSTM,因此标记窗口的每一帧都没有意义。您可以做的就是只有一个输出并将其与您的标签进行比较(多对一结构)。换句话说,即使您的LSTM单元在每个步骤都产生输出,您也只在最后一步考虑输出以计算损耗。
for epoch in n_epoch: # number of batches to show to your LSTM
# batch_features = numFrames x batchSize x numChannel x Width x Height
# batch_labels = batchSize x 1
batch_features, batch_labels = getBatch()
# initialize cell state
h = zeros()
for frame in numFrames:
# here the main loop of the LSTM. out will be constantly overwritten
h, out = LSTM(h, batch_features[frame])
# use only the final output to compute the loss
loss = crossEntropywithLogits(out, batch_labels)