C M*_*lah 5 python deep-learning keras tensorflow
我正在尝试使用 Keras 库实现带有注意力的序列 2 序列模型。模型框图如下

该模型将输入序列嵌入到 3D 张量中。然后双向 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)
Run Code Online (Sandbox Code Playgroud)
问题是当我连接注意力层和解码器输入时。由于解码器输入是 3D 张量而注意力是 2D 张量,因此显示以下错误:
ValueError:
Concatenate图层需要具有匹配形状的输入,除了 concat 轴。得到输入形状:[(None, 1024), (None, 10, 8281)]
如何将 2D 注意张量转换为 3D 张量?
根据您的框图,您似乎在每个时间步都将相同的注意力向量传递给解码器。在这种情况下,您需要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)
# ...
Run Code Online (Sandbox Code Playgroud)
请注意,这将为每个时间步重复相同的注意力向量。
| 归档时间: |
|
| 查看次数: |
3575 次 |
| 最近记录: |