序列到序列模型TypeError上的Keras注意层:无法迭代未知第一维的张量

2024-09-26 22:55:31 发布

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

我正在使用Tensorflow2.1.1,并试图建立一个有注意力的序列到序列模型

latent_dim = 300
embedding_dim=100
batch_size  = 128

# Encoder
encoder_inputs = tf.keras.Input(shape=(None,), dtype='int32')

#embedding layer
enc_emb =  tf.keras.layers.Embedding(x_voc, embedding_dim,trainable=True)(encoder_inputs)

#encoder lstm 1
encoder_lstm = tf.keras.layers.LSTM(latent_dim,return_sequences=True,return_state=True,dropout=0.4,recurrent_dropout=0.4)
encoder_output, state_h, state_c = encoder_lstm(enc_emb)
print(encoder_output.shape)

# Set up the decoder, using `encoder_states` as initial state.
decoder_inputs = tf.keras.Input(shape=(None,), dtype='int32')

#embedding layer
dec_emb_layer = tf.keras.layers.Embedding(y_voc, embedding_dim,trainable=True)
dec_emb = dec_emb_layer(decoder_inputs)

decoder_lstm = tf.keras.layers.LSTM(latent_dim, return_sequences=True, return_state=True,dropout=0.4,recurrent_dropout=0.2)
decoder_output,decoder_fwd_state, decoder_back_state = decoder_lstm(dec_emb,initial_state=[state_h, state_c])

# Attention layer
attn_out, attn_states = tf.keras.layers.Attention()([encoder_output, decoder_output])

# Concat attention input and decoder LSTM output
decoder_concat_input = tf.keras.layers.Concatenate(axis=-1, name='concat_layer')([decoder_output, attn_out])

#dense layer
decoder_dense =  tf.keras.layers.TimeDistributed(Dense(y_voc, activation='softmax'))
decoder_outputs = decoder_dense(decoder_concat_input)

# Define the model 
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

model.summary()

运行此命令时,在创建注意层TypeError: Cannot iterate over a tensor with unknown first dimension.时出现错误

我检查了encoder_outputdecoder_output的维度,它们都是(None, None, 300),所以我认为这可能是问题所在。但是我检查了来自tensorflow example的注意示例,它们的注意层输入参数也有None维度

我想知道我错过了什么?请建议

编辑

添加堆栈跟踪

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-49-d37cd48e626b> in <module>()
     28 
     29 # Attention layer
---> 30 attn_out, attn_states = tf.keras.layers.Attention()([encoder_output, decoder_output])
     31 
     32 # Concat attention input and decoder LSTM output

~/anaconda3/lib/python3.6/site-packages/tensorflow_core/python/framework/ops.py in __iter__(self)
    546     if shape[0] is None:
    547       raise TypeError(
--> 548           "Cannot iterate over a tensor with unknown first dimension.")
    549     for i in xrange(shape[0]):
    550       yield self[i]

TypeError: Cannot iterate over a tensor with unknown first dimension.

Tags: nonelayertrueencoderoutputlayerstfembedding
1条回答
网友
1楼 · 发布于 2024-09-26 22:55:31

错误是因为keras注意输出1张量,而您期望2张量。你需要改变

attn_out, attn_states = tf.keras.layers.Attention()([encoder_output, decoder_output])

进入

attn_out = tf.keras.layers.Attention()([encoder_output, decoder_output])

这里是完整的模型

# Encoder
encoder_inputs = tf.keras.Input(shape=(None,), dtype='int32')

#embedding layer
enc_emb =  tf.keras.layers.Embedding(x_voc, embedding_dim)(encoder_inputs)

#encoder lstm 1
encoder_lstm = tf.keras.layers.LSTM(latent_dim, return_sequences=True,return_state=True)
encoder_output, state_h, state_c = encoder_lstm(enc_emb)

# Set up the decoder, using `encoder_states` as initial state.
decoder_inputs = tf.keras.Input(shape=(None,), dtype='int32')

#embedding layer
dec_emb = tf.keras.layers.Embedding(y_voc, embedding_dim)(decoder_inputs)

decoder_lstm = tf.keras.layers.LSTM(latent_dim, return_sequences=True, return_state=True)
decoder_output,decoder_fwd_state,decoder_back_state = decoder_lstm(dec_emb,initial_state=[state_h, state_c])

# Attention layer
attn_out = tf.keras.layers.Attention()([encoder_output, decoder_output])

# Concat attention input and decoder LSTM output
decoder_concat_input = tf.keras.layers.Concatenate(axis=-1, name='concat_layer')([decoder_output, attn_out])

#dense layer
decoder_dense =  tf.keras.layers.TimeDistributed(Dense(y_voc, activation='softmax'))
decoder_outputs = decoder_dense(decoder_concat_input)

# Define the model 
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

model.summary()

相关问题 更多 >

    热门问题