在Keras上用解码器输入seq2seq模型连接注意层

2024-04-29 06:43:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图使用Keras库实现一个sequence 2 sequence模型。模型的框图如下所示

Enter image description here

该模型将输入序列嵌入到三维张量中。然后,双向lstm创建编码层。接下来,编码序列被发送到自定义注意层,该层返回一个2D张量,该张量具有每个隐藏节点的注意权重

解码器输入作为一个热向量注入模型中。现在在解码器(另一个bi lstm)中,解码器输入和注意权重都作为输入传递。解码器的输出通过softmax激活函数发送到时间分布密集层,以概率的方式获得每个时间步的输出。模型的代码如下所示:

encoder_input = Input(shape=(MAX_LENGTH_Input, ))

embedded = Embedding(input_dim=vocab_size_input, output_dim= embedding_width, trainable=False)(encoder_input)

encoder = Bidirectional(LSTM(units= hidden_size, input_shape=(MAX_LENGTH_Input,embedding_width), return_sequences=True, dropout=0.25, recurrent_dropout=0.25))(embedded)

attention = Attention(MAX_LENGTH_Input)(encoder)

decoder_input = Input(shape=(MAX_LENGTH_Output,vocab_size_output))

merge = concatenate([attention, decoder_input])

decoder = Bidirectional(LSTM(units=hidden_size, input_shape=(MAX_LENGTH_Output,vocab_size_output))(merge))

output = TimeDistributed(Dense(MAX_LENGTH_Output, activation="softmax"))(decoder)

问题是当我连接注意层和解码器输入时。由于解码器输入是3D张量,而注意是2D张量,因此显示以下错误:

ValueError: A Concatenate layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 1024), (None, 10, 8281)]

如何将2D注意张量转换为3D张量


Tags: 模型encoderinputoutputsize解码器lengthmax
1条回答
网友
1楼 · 发布于 2024-04-29 06:43:11

根据你的方块图,看起来你在每一个时间步都把相同的注意力向量传递给了解码器。在这种情况下,您需要RepeatVector在每个时间步复制相同的注意向量,以将2D注意张量转换为3D张量:

# ...
attention = Attention(MAX_LENGTH_Input)(encoder)
attention = RepeatVector(MAX_LENGTH_Output)(attention) # (?, 10, 1024)
decoder_input = Input(shape=(MAX_LENGTH_Output,vocab_size_output))
merge = concatenate([attention, decoder_input]) # (?, 10, 1024+8281)
# ...

请注意,这将在每个时间步重复相同的注意向量

相关问题 更多 >