无法正确定义LSTM的输入以建模多对一方案

时间:2019-01-22 15:05:56

标签: python tensorflow keras lstm

我是Keras和循环层的新手,例如LSTM。

我应该解决以下任务:鉴于事件序列,有必要预测每个序列的类。

更多详细信息:我有一些事件的历史数据。该序列由N个事件组成,其中N不固定。对于每个事件序列,我想预测一个类别(0、1或2)。我有很多简短的训练顺序。

为完成此任务,我正在开发带有softmax层的LSTM(多对一),用于多类分类。

例如,让我们假设我有这些数据(N个事件的批次):

1, 17 => 0
1, 18
0, 18

0, 18 => 1
1, 19
0, 19
0, 20

…

0, 11 => 1
1, 11

序列中事件的优先级非常重要。如果更改优先级,则相应的类别也可以更改。 例如,如果通过交换第二行和第三行来更改上面显示的第一个序列,则类别可以从0更改为1:

1, 17 => 1
0, 18
1, 18

我想使用LSTM(多对一),因为它允许考虑事件优先级对类的影响(如果我理解正确的话)。

这是我的起始代码:

import pandas as pd
from sklearn import model_selection

events = {
            'batch_id': [0,0,0,1,1,2,2,2,2,2],
            'phase': [1,0,1,1,0,0,1,0,0,1],
            'hour': [16,16,17,17,17,18,18,19,20,20],
            'event_category': [1,1,1,2,2,0,0,0,0,0]
        }

columns = ['batch_id', 'phase', 'hour', 'event_category']

df = pd.DataFrame(events, columns=columns)

X = df.drop('event_category',1).drop('batch_id',1)
y = df['event_category']
output_classes = y.nunique()

我最大的问题是我不知道如何对序列大小的变化进行建模。我介绍了一个列batch_id。可以注意到,我有3个大小顺序:3、2、5。

如何将这些数据放入深度网络?序列的大小是否应该总是固定的?

这是我的模型设置草案。在这种设置中,我缺乏将输入数据定义为序列的定义。也许我应该以某种方式更改events的格式?

from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM

model = Sequential()
model.add(LSTM(
                units=1, 
                return_sequences=False, 
                input_shape=(None,X_train.shape[1])
              )
         )

model.add(Dropout(0.2))

model.add(Dense(activation='softmax', units=output_classes))

# Define a performance metric
model.compile(loss="categorical_crossentropy",
              optimizer='adadelta')

1 个答案:

答案 0 :(得分:0)

使用Keras时,您需要指定固定形状的输入批次。如果序列的长度不同,则可以使用以下选项:

  • 填充序列的长度相同(例如,带有0个向量)
  • 如果长度变化很大(使用相同权重重新初始化模型),请使用存储桶来存储序列大小
  • 使用PyTorch或任何其他动态图NN库