使用 Keras 功能 API 将时间序列与 RNN/LSTM 中的时间不变数据相结合

Posted

技术标签:

【中文标题】使用 Keras 功能 API 将时间序列与 RNN/LSTM 中的时间不变数据相结合【英文标题】:Combine Time-series with time-invariant data in RNN/LSTM using Keras Functional API 【发布时间】:2019-12-10 23:23:50 【问题描述】:

更新:正如rvinas 所指出的,我忘记在Model 中添加inputs_aux 作为第二个input。现在修复了,它可以工作了。所以 ConditionalRNN 可以很容易地用来做我想做的事情。

我想在扩展的 LSTM 单元中同时处理时间序列和非时间序列特征(还讨论了一个要求here)。 ConditionalRNN (cond-rnn) 用于 Python 中的 Tensorflow 似乎允许这样做。

可以在 Keras 函数式 API 中使用(无需急切执行)吗? 也就是说,有没有人知道如何修复下面我失败的方法,或者使用 ConditionalRNN(或替代方法)在 LSTM 样式单元或任何等效单元中轻松组合 TS 和非 TS 数据的不同示例?

我在 Pilippe Remy's ConditionalRNN github page 上看到了急切的执行裸 tf 示例,但我没有设法将它扩展到 Keras 功能 API 中易于适配的版本。

我的代码如下所示;如果我使用标准 LSTM 单元(并相应地调整模型“x”输入)而不是 ConditionalRNN,它会起作用。使用 ConditionalRNN,我没有让它执行;我在更改代码时收到了 must feed a value for placeholder tensor 'in_aux' 错误(参见下文),或者收到了一些不同类型的输入大小投诉,尽管我尝试注意数据维度的兼容性。

(在 Ubuntu 16.04 上使用 Python 3.6、Tensorflow 2.1、cond-rnn 2.1)

import numpy as np

from tensorflow.keras.models import Model
from tensorflow.keras.layers import LSTM, Dense, Input
from cond_rnn import ConditionalRNN

inputs = Input(name='in',shape=(5,5)) # Each observation has 5 dimensions à 5 time-steps each
x = Dense(64)(inputs)

inputs_aux = Input(name='in_aux', shape=[5]) # For each of the 5 dimensions, a non-time-series observation too
x = ConditionalRNN(7, cell='LSTM')([x,inputs_aux]) # Updated Syntax for cond_rnn v2.1
# x = ConditionalRNN(7, cell='LSTM', cond=inputs_aux)(x) # Syntax for cond_rnn in some version before v2.1

predictions = Dense(1)(x)
model = Model(inputs=[inputs, inputs_aux], outputs=predictions) # With this fix, [inputs, inputs_aux], it now works, solving the issue
#model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='rmsprop', loss='mean_squared_error', metrics=['mse'])
data = np.random.standard_normal([100,5,5]) # Sample of 100 observations with 5 dimensions à 5 time-steps each
data_aux = np.random.standard_normal([100,5]) # Sample of 100 observations with 5 dimensions à only 1 non-time-series value each
labels = np.random.standard_normal(size=[100]) # For each of the 100 obs., a corresponding (single) outcome variable

model.fit([data,data_aux], labels)

我得到的错误是

tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'in_aux' with dtype float and shape [?,5]
     [[node in_aux]]

回溯是

Traceback (most recent call last):
  File "/home/florian/temp_nonclear/playground/test/est1ls_bare.py", line 20, in <module>
    model.fit('in': data, 'in_aux': data_aux, labels) #model.fit([data,data_aux], labels) # Also crashes when using model.fit('in': data, 'in_aux': data_aux, labels)
  File "/home/florian/BB/tsgenerator/ts_wgan/venv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 643, in fit
    use_multiprocessing=use_multiprocessing)
  File "/home/florian/BB/tsgenerator/ts_wgan/venv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training_arrays.py", line 664, in fit
    steps_name='steps_per_epoch')
  File "/home/florian/BB/tsgenerator/ts_wgan/venv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training_arrays.py", line 383, in model_iteration
    batch_outs = f(ins_batch)
  File "/home/florian/BB/tsgenerator/ts_wgan/venv/lib/python3.5/site-packages/tensorflow/python/keras/backend.py", line 3353, in __call__
    run_metadata=self.run_metadata)
  File "/home/florian/BB/tsgenerator/ts_wgan/venv/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1458, in __call__
    run_metadata_ptr)

【问题讨论】:

你的模型定义不应该是model = Model(inputs=[inputs, inputs_aux], outputs=predictions)吗? 谢谢@rvinas,你解决了我的问题(如果你发布答案我可以接受,即使我的错误很严重) @FlorianH 我尝试运行更正后的代码,但出现错误 TypeError: ('Keyword argument not understand:', 'cond')。你知道这种不匹配的原因吗? @Malintha 最新的 cond-rnn,v 2.1,似乎需要x = ConditionalRNN(7, cell='LSTM')([x,inputs_aux]) 而不是x = ConditionalRNN(7, cell='LSTM', cond=inputs_aux)(x)。让它再次为我工作。参照。 调用 cond_rnn/cond_rnn.py中的定义 @FlorianH 是的,它在该输入模式下运行良好。谢谢 【参考方案1】:

我注意到您没有将 inputs_aux 作为输入传递给您的模型。 TF 抱怨是因为需要这个张量来计算你的输出predictions,并且它没有被输入任何值。如下定义模型应该可以解决问题:

model = Model(inputs=[inputs, inputs_aux], outputs=predictions)

【讨论】:

以上是关于使用 Keras 功能 API 将时间序列与 RNN/LSTM 中的时间不变数据相结合的主要内容,如果未能解决你的问题,请参考以下文章

Keras 功能 API:采用多个输入的拟合和测试模型

尝试使用 Keras 功能 API 构建 CNN 模型时图形断开连接

如果在使用功能 API 构建的多输入/输出 Keras 模型中使用生成器应该返回啥?

使用 Tensorflow 2 的 Keras 功能 API 时传递 `training=true`

无法使用 Keras 和 Sklearn 将字符串列转换为分类矩阵

Keras 功能 api 输入形状错误,lstm 层收到 2d 而不是 3d 形状