我正在尝试使用keras库注意实现序列2序列模型。该模型的框图如下
该模型将输入序列嵌入3D张量中。然后,双向lstm创建编码层。接下来,将编码后的序列发送到自定义“注意”层,该层返回具有每个隐藏节点注意权重的2d张量。解码器输入作为一个热矢量注入模型。现在,在解码器(另一个bistm)中,解码器输入和注意力权重都作为输入传递。解码器的输出被发送到具有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:
Concatenate
层需要输入(除了concat轴以外)具有匹配的形状。得到了输入形状:[(无,1024),(无,10,8281)]
如何将2d注意张量转换为3d张量?
答案 0 :(得分:3)
根据您的框图,您似乎在每个时间步上都将相同的关注向量传递给解码器。在这种情况下,您需要# ...
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)
# ...
在每个时间步复制相同的关注向量,以将2D注意张量转换为3D张量:
<h2 class="heading heading--sub feature-box__heading">Ärikinnisvara- <br> haldus</h2>
请注意,这将在每个时间步重复相同的注意力向量。