Answers:
对于RNN(例如LSTM和GRU),层输入是时间步长列表,每个时间步长都是特征张量。这意味着您可以有一个这样的输入张量(用Python表示法):
# Input tensor to RNN
[
# Timestep 1
[ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
# Timestep 2
[ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
# Timestep 3
[ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
...
]
因此绝对可以在每个时间步上具有多个功能。在我看来,天气是时间序列的特征:我居住的地方恰好是时间的函数。因此,将天气信息编码为每个时间步中的一项功能是非常合理的(使用适当的编码,例如,多云= 0,晴天= 1等)。
如果您有非时间序列数据,那么通过LSTM传递数据就没有任何意义。也许LSTM仍然可以工作,但是即使可以,它也可能以每次训练时间损失更高/准确性更低为代价。
或者,您可以通过其他层将这种“额外”信息引入LSTM之外的模型中。您可能会有这样的数据流:
TIME_SERIES_INPUT ------> LSTM -------\
*---> MERGE ---> [more processing]
AUXILIARY_INPUTS --> [do something] --/
因此,您可以将辅助输入合并到LSTM输出中,然后从那里继续网络。现在,您的模型就是简单的多输入。
例如,假设在您的特定应用程序中,您仅保留LSTM输出序列的最后一个输出。假设它是一个长度为10的向量。您的辅助输入可能是您编码的天气(标量)。你的合并层可以简单地辅助气象信息附加到LSTM输出向量的末尾以产生长度为11的单个向量但你并不需要只保留最后LSTM输出时间步:如果LSTM输出100时步,每个具有10个向量的要素,您仍然可以使用辅助天气信息,从而获得100个时间步长,每个时间步长包含11个数据点的向量。
有关功能API的Keras文档对此进行了很好的概述。
在其他情况下,正如@horaceT指出的那样,您可能希望将LSTM限制在非时间数据上。例如,在给定位置的情况下,预测明天的天气。在这种情况下,以下是三个建议,每个建议都带有正面/负面的含义:
让第一时间步包含您的条件数据,因为它可以有效地“设置” RNN的内部/隐藏状态。坦率地说,出于种种原因,我不会这样做:您的条件数据必须与其余功能的形状相同,这使得创建有状态RNN更加困难(就非常谨慎地跟踪数据的馈送方式而言)进入网络),网络可能会以足够的时间(例如长训练序列或长预测序列)等“忘记”条件数据。
将数据包括为时间数据本身的一部分。因此,在特定时间步长的每个特征向量都包含“大部分”时间序列数据,但随后会将条件数据附加到每个特征向量的末尾。网络会学会识别这一点吗?可能,但即使如此,您仍在使用非序列信息污染序列数据,从而创建了一项难度更大的学习任务。所以我也不要这样做。
也许最好的办法是直接影响在时间零RNN的隐藏状态。这是由所采用的方法Karpathy和费-费和由Vinyals等。它是这样工作的:
此方法是最“理论上正确”的方法,因为它可以在非时间输入上适当地调整RNN,自然解决形状问题,还可以避免使用其他非时间信息污染输入时间步长。缺点是这种方法通常需要对体系结构进行图形级别的控制,因此,如果使用的是Keras等更高级别的抽象,除非添加自己的图层类型,否则很难实现。
基于此线程的所有良好答案,我编写了一个以辅助输入为条件的库。它抽象了所有复杂性,并被设计为尽可能易于使用:
https://github.com/philipperemy/cond_rnn/(tensorflow)
希望能帮助到你!