我是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')
答案 0 :(得分:0)
使用Keras时,您需要指定固定形状的输入批次。如果序列的长度不同,则可以使用以下选项: