sequence2sequence模型中具有Keras注意的连接层形状误差



我试图在Colab中使用Keras实现一个简单的单词级序列到序列模型。我使用的是Keras Attention图层。下面是模型的定义:

embedding_size=200
UNITS=128
encoder_inputs = Input(shape=(None,), name="encoder_inputs")
encoder_embs=Embedding(num_encoder_tokens, embedding_size, name="encoder_embs")(encoder_inputs)
#encoder lstm
encoder = LSTM(UNITS, return_state=True, name="encoder_LSTM") #(encoder_embs)
encoder_outputs, state_h, state_c = encoder(encoder_embs)
encoder_states = [state_h, state_c]
decoder_inputs = Input(shape=(None,), name="decoder_inputs")
decoder_embs = Embedding(num_decoder_tokens, embedding_size, name="decoder_embs")(decoder_inputs)
#decoder lstm
decoder_lstm = LSTM(UNITS, return_sequences=True, return_state=True, name="decoder_LSTM")
decoder_outputs, _, _ = decoder_lstm(decoder_embs, initial_state=encoder_states)
attention=Attention(name="attention_layer")
attention_out=attention([encoder_outputs, decoder_outputs])
decoder_concatenate=Concatenate(axis=-1, name="concat_layer")([decoder_outputs, attention_out])
decoder_outputs = TimeDistributed(Dense(units=num_decoder_tokens, 
activation='softmax', name="decoder_denseoutput"))(decoder_concatenate)
model=Model([encoder_inputs, decoder_inputs], decoder_outputs, name="s2s_model")
model.compile(optimizer='RMSprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()

模型编译很好,没有任何问题。编码器和解码器的输入和输出形状为:

Encoder training input shape:  (4000, 21)
Decoder training input shape:  (4000, 12)
Decoder training target shape:  (4000, 12, 3106)
--
Encoder test input shape:  (385, 21)

这是模型。适合代码:

model.fit([encoder_training_input, decoder_training_input], decoder_training_target,
epochs=100,
batch_size=32,
validation_split=0.2,)

当我运行fit阶段时,我从Concatenate层得到这个错误:

ValueError: Dimension 1 in both shapes must be equal, but are 12 and 32. 
Shapes are [32,12] and [32,32]. for '{{node s2s_model/concat_layer/concat}} = ConcatV2[N=2, T=DT_FLOAT, Tidx=DT_INT32](s2s_model/decoder_LSTM/PartitionedCall:1,
s2s_model/attention_layer/MatMul_1, s2s_model/concat_layer/concat/axis)' with input shapes: [32,12,128], [32,32,128], [] and with computed input tensors: input[2] = <2>.

因此,前32个是batch_size, 128个是decoder_outputsattention_out的输出形状,12个是解码器输入的令牌数。我不明白如何解决这个错误,我不能改变输入令牌的数量,我认为,有什么建议吗?

将连接层中的axis=-1替换为axis=1。本文档中的示例应该说明为什么。

您的问题在于传递给串联的输入。您需要指定右轴来连接两个不同形状的矩阵或张量,因为它们在Tensorflow中被称为张量。形状[32,12,128]和[32,32,128]在通过传递1引用的第二维中不同(因为维度从0开始)。这将产生一个形状[32,(12+32),128],增加了第二次元的元素。

当您指定轴为-1(默认值)时,您的连接层基本上在使用前将输入平坦化,这在您的情况下由于尺寸的差异而不起作用。

多亏了@Majitsima才解决了这个问题。我交换了注意力层的输入,所以不是

attention=Attention(name="attention_layer")
attention_out=attention([encoder_outputs, decoder_outputs])

输入是

attention=Attention(name="attention_layer")
attention_out=attention([decoder_outputs, encoder_outputs])

decoder_concatenate=Concatenate(axis=-1, name="concat_layer")([decoder_outputs, attention_out])

现在一切似乎都工作了,所以再次感谢你@Majitsima,希望这能帮助到你!

相关内容

  • 没有找到相关文章

最新更新