重复所有隐藏状态的 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)
数据:
具有形状 = (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)