【问题标题】:Keras: Passing an array through a shared LSTM layer?Keras:通过共享 LSTM 层传递数组?
【发布时间】: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


【解决方案1】:

正如您所说,您希望您的网络使用多个具有共享权重的 LSTM 处理多个序列,但是在您提供的代码中,只有一个序列作为网络的输入。这是我对两个序列的建议,例如:

sq_inpt1 = Input(shape=(self.MAX_SEQ_LEN, 1), name='sq_inpt1')
sq_inpt2 = Input(shape=(self.MAX_SEQ_LEN, 1), name='sq_inpt2')
sq_embd_1 = embed(sq_inpt1)
sq_embd_2 = embed(sq_input2)
lstm_layer = LSTM(200, go_backwards=False)
embd_list = [sq_embd_1,sq_emb2]
lstm_embd = []
for embd in embd_list :
    lstm_embd.append(lstm_layer(embd))
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])
### Then continue the rest of the network

或者,您可以使用带有扩展的暗淡的单个数组作为输入(例如,第一个暗淡索引序列号),脚本将被修改如下:

sq_list = Input(shape=(self.num_seq,self.MAX_SEQ_LEN, 1), name='sq_list')
embd_list = []
for i in range(sq_list.shape[0]):
    embd_list.append(embd(sq_list[i])
lstm_layer = LSTM(200, go_backwards=False)
lstm_embd = []
for embd in embd_list :
    lstm_embd.append(lstm_layer(embd))
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])
### Then continue the rest of the network

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2018-09-29
    相关资源
    最近更新 更多