错误:无效参数:ConcatOp:输入的维度应匹配



我正试图将注意力层添加到Seq2Seq模型中,但在拟合火车集时,我在连接步骤上得到了InvalidArgumentError。错误来自concat步骤,它的concat解码器输出和注意力输出。

提到的错误:

输入的尺寸应匹配:shape[0]=[32,15300]vs.shape[1]=[32,32300]

我的理解是,第一个32项是批量,第二个是序列长度,300是单位数量。但是为什么形状[1]在第二项中也有32个呢?

下面是我的代码,任何见解都会非常有帮助。

WORD2VEC_DIMS = 50
DICTIONARY_SIZE = num_tokens
units = 300
ADAM = Adam(lr=0.00005)
MAX_LEN = 15 
drop_out_rate= 0.2
encoder_inputs_att = Input(shape=( MAX_LEN , ))
encoder_embedding_att = embedding_layer_encoder(encoder_inputs_att)
encoder_embedding_att=layers.SpatialDropout1D(drop_out_rate)(encoder_embedding_att)
encoder_outputs_att , state_h_att , state_c_att = LSTM( units , return_state=True )( encoder_embedding_att )
encoder_states_att = [ state_h_att , state_c_att ]
decoder_inputs_att = Input(shape=( MAX_LEN ,  ))
decoder_embedding_att = embedding_layer_decoder(decoder_inputs_att)
decoder_lstm_att = LSTM( units , return_state=True , return_sequences=True )
decoder_outputs_att , state_dec_h_att , state_dec_c_att = decoder_lstm_att ( decoder_embedding_att , initial_state=encoder_states_att )
# add attention
attn_layer_att = Attention(name='attention_layer', causal = True)
attn_out_att = attn_layer_att([encoder_outputs_att, decoder_outputs_att])
#decoder_outputs_att = tf.keras.layers.GlobalAveragePooling1D()(decoder_outputs_att)
#attn_out_att = tf.keras.layers.GlobalAveragePooling1D()(attn_out_att)
decoder_concat_input_att = Concatenate(axis=-1, name='concat_layer')([decoder_outputs_att, attn_out_att])
decoder_dense_att = Dense( DICTIONARY_SIZE , activation="softmax" ) 
# add time distributed
dense_time_att = TimeDistributed(decoder_dense_att, name='time_distributed_layer')
output_att = dense_time_att ( decoder_concat_input_att )
#output = tf.cast(tf.keras.backend.argmax(output), tf.float64)
output_att = tf.cast(output_att,tf.float64)
model_att = tf.keras.models.Model([encoder_inputs_att, decoder_inputs_att], output_att )
model_att.compile(optimizer=ADAM, loss='sparse_categorical_crossentropy')
model_att.summary()
model_att.fit([x_train, y_train], y_train_decoded, batch_size = 32, epochs = 50, validation_split=0.1, shuffle=True)

您以相反的顺序向关注者提供了参数。应该是:

attn_out_att = attn_layer_att([decoder_outputs_att, encoder_outputs_att])

来自tf.keras.layers.Attention文档:inputs:以下张量列表:

  • 查询:查询形状为[batch_size, Tq, dim]Tensor
  • value:形状[batch_size, Tv, dim]的值Tensor
  • key:形状为[batch_size, Tv, dim]的可选键Tensor。如果未给定,则将对键和值都使用值,这是最常见的情况

在seq2seq模型的情况下,可以将注意力想象为解码器对编码器信息的概率检索。在每个解码步骤中,解码器从编码器收集相关内容。因此,解码器状态被用作查询,编码器状态是检索到的