【发布时间】:2021-11-12 15:20:41
【问题描述】:
我想用时间序列数据构建一个网络,并且我正在扩大以前的问题实例。
# input = { sequence:list of int, time: int, score: float}
embed = Embedding(output_dim=100, input_dim=self.sequence_range + 1, mask_zero=True, name='sequence_embedding')
sq_inpt = Input(shape=(self.MAX_SEQ_LEN, 1), name='sq_inpt')
sq_embed = embed(sq_inpt)
lstm_embed = LSTM(200, go_backwards=False)(sq_embed)
time_inpt = Input(shape=(1,), name='time_inpt')
score_inpt = Input(shape=(1,), name='score_inpt')
state_embed = Concatenate()([lstm_embed, time_inpt, score_inpt])
state_embed = Dense(300, activation='elu', name='state_embed_1')(state_embed)
state_embed = Dense(300, activation='elu', name='state_embed_2')(state_embed)
output = Dense(1, name='output')(state_embed)
model = Model(inputs=[sq_inpt, time_inpt, score_inpt], outputs=output)
我之前的网络在输入上有一个嵌入层,该嵌入层被馈送到 LSTM。 LSTM 的输出以及其他两个数字输入被进一步馈送到两个 Dense 层,然后接收单个单元输出。
在新版本中,我想传递多个序列作为输入,每个序列都应该独立通过LSTM层,然后在添加到state_embed之前进行连接。
# input = { sequences:list of(list of int), time: int, score: float}
embed = Embedding(output_dim=100, input_dim=self.sequence_range + 1, mask_zero=True, name='sequence_embedding')
sq_inpt = Input(shape=(self.MAX_SEQ_LEN, 1), name='sq_inpt')
sq_embed = embed(sq_inpt)
##CHANGE NEEDED HERE#######
lstm_layer = LSTM(200, go_backwards=False)
lstm_embed = []
for sequence in sq_embed:
lstm_embed.append(lstm_layer(sequence)
###########################
.
.
.
state_embed = Concatenate()([lstm_embed, time_inpt, score_inpt])
.
.
.
model = Model(inputs=[sq_inpt, time_inpt, score_inpt], outputs=output)
我知道上面的代码不起作用,但这是我能想到的最清晰的表示我想要的方式。我不希望每个序列都有一个唯一的 LSTM 层,因为我想共享权重。
如何在 Keras 中实现这一点?
【问题讨论】:
-
我不确定我是否理解。您说您希望输入由整数列表而不是整数列表组成,但是两个代码 sn-ps 中输入的形状是相同的。您能否为现有 NN 提供可重现的代码 sn-p,以及所需 NN 的示例输入?
标签: lstm tf.keras keras-layer