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

Combine Time-series with time-invariant data in RNN/LSTM using Keras Functional API

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

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

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

我在 Pilippe Remy's ConditionalRNN github page 上看到了 eager execution-bare tf 示例,但我没有设法将它扩展到 Keras Functional API.

中的一个易于安装的版本

我的代码如下所示;如果我使用标准 LSTM 单元而不是 ConditionalRNN(并相应地调整模型 'x' 输入),它就会起作用。使用 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)

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

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