如何在每个“批次”中使用单个标签训练LSTM

时间:2019-05-11 13:47:45

标签: python tensorflow keras

我想训练状态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神经元数]。

1 个答案:

答案 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)