如何将向量中的数字和分类值组合为LSTM的输入?

时间:2018-07-16 11:32:00

标签: python keras deep-learning lstm categorical-data

model = Sequential()
model.add(LSTM(64, batch_input_shape=(batch_size, look_back, 1), stateful=True, return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(32, batch_input_shape=(batch_size, look_back, 1), stateful=True))
model.add(Dropout(0.3))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer=adam)
model.fit(trainX, trainY, epochs=100, batch_size=batch_size, verbose=2, shuffle=False)

我分享了上面的代码示例。我的问题是如何将数字变量和分类变量结合起来作为LSTM的输入?

输入向量应如何?

  1. 应该像[0.123,0,1,0,0 ...](就像代码中的X一样)dim =(1,8)吗?
  2. 应该是[0.123,[0,1,0,0 ...]] dim(1,2)
  3. 或者是否存在将输入传递到ANN或RNN等的特定方法/方式。如果是,它是什么?为什么我们应该使用它/它们(优点/缺点)?

我阅读了有关嵌入的内容,但由于我想学习所有这些背后的逻辑,因此解释对我来说似乎还不够。

像这样...

filter

任何指导,链接,解释或帮助都将得到应用……祝您愉快。

2 个答案:

答案 0 :(得分:2)

通常在处理各种范围的输入(例如标准化等)时可以查看多种预处理。热门表示无疑是表示类别的一种好方法。

当类别元素太多时使用嵌入,这会使一种热编码变得非常大。它们提供矢量表示(可能是可训练的),该表示对给定的输入进行编码。您可以在下面的链接中阅读有关它们的更多信息。嵌入的使用在NLP中非常普遍。

https://towardsdatascience.com/deep-learning-4-embedding-layers-f9a02d55ac12

此外,您还可以利用Keras建模支持多个输入层这一事实。

对于您的特定情况,这是一个虚构的示例,可以帮助您入门。再次,我添加了一些密集的隐藏层只是为了说明这一点。应该是自我解释

X1 = rands  
X2 = df_days_onehot
Y = np.random.random(7)

float_input = Input(shape=(1, ))
one_hot_input = Input(shape=(7,) )

first_dense = Dense(3)(float_input)
second_dense = Dense(50)(one_hot_input)

merge_one = concatenate([first_dense, second_dense])
dense_inner = Dense(10)(merge_one)
dense_output = Dense(1)(dense_inner)


model = Model(inputs=[float_input, one_hot_input], outputs=dense_output)


model.compile(loss='mean_squared_error',
              optimizer='adam',
              metrics=['accuracy'])

model.summary()

model.fit([X1,X2], Y, epochs=2)

答案 1 :(得分:0)

另一种方法(可能更优雅)是使用分类变量(其值不会随时间变化)。

让我们以来自两个不同城市的天气数据为例:巴黎和旧金山。您想根据历史数据预测下一个温度。但同时,您预计天气会因城市而异。您可以:

  • 将辅助功能与时间序列数据(在此处建议的内容)结合起来。

  • 将辅助要素与RNN层的输出连接在一起。由于RNN层看不到此辅助信息,因此属于RNN后的调整。

  • 或者仅使用学习到的条件表示形式(例如巴黎或旧金山)来初始化RNN状态。

我写了一个库,以辅助输入为条件。它抽象了所有复杂性,并被设计为尽可能易于使用:

https://github.com/philipperemy/cond_rnn/

希望有帮助!