重复所有隐藏状态的 keras LSTM 输出

Repeat keras LSTM output of all hidden states

数据:

具有形状 = (T, M) #same for all firms 的宏观时间序列
形状为 (T, N, K) #firm-specific data

的微观时间序列

其中 T 是以月为单位的时间维度,M 是宏观特征的数量,N 是公司的数量,K 是微观特征的数量,例如 P/E 比率等

任务:使用 LSTM 输出,重复 N 次并与微数据连接

我想使用 LSTM 的输出,即所有公司 T 中所有 t 的所有(这里 H=4)隐藏状态,因此设置 return_sequences=True,并按顺序重复 N 次将它们与我的微数据连接起来,即使用 shape = (T, N, K+H)

获取新数据

然后,这些新数据将被重塑为 (T*N, K+H),并输入具有自定义损失函数的前馈神经网络,该函数适用于两个神经网络,并且只能在时间 T 计算,因此 batch-size=1!.

我已经尝试过以下方法,但由于变暗而不起作用:

from keras.layers import concatenate, Input, LSTM, RepeatVector
from keras.utils.vis_utils import plot_model
from keras.models        import Model

in_macro        = Input(shape = (T, M),         name = 'macro_input')
in_micro        = Input(shape = (T, N, K),      name = 'micro_input')

lstm            = LSTM(4, return_sequences=True)(in_macro)
rep             = RepeatVector(N)(lstm)
conc            = concatenate([in_micro, rep])
model           = Model(inputs=[in_micro,in_macro], outputs=conc)

plot_model(model, show_shapes=True)

ValueError: Input 0 is incompatible with layer repeat_vector_1: expected ndim=2, found ndim=3

是否有一种有效的方法可以达到这个目标,甚至不需要重复?

找到使用 Lambda 层和堆栈的解决方案:

from keras.layers import concatenate, Input, LSTM
from keras.utils.vis_utils import plot_model
from keras.models import Model
import keras.backend as k

in_macro = Input(shape=(T, M), name='macro_input')
in_micro = Input(shape=(T, N, K), name='micro_input')

lstm = LSTM(4, return_sequences=True)(in_macro)
stack = Lambda(lambda x: k.stack(N*[x], axis=2))(lstm)
conc = concatenate([in_micro, stack])
model = Model(inputs=[in_micro,in_macro], outputs=conc)

plot_model(model, show_shapes=True)