微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Keras,模型训练成功,但生成预测给出 ValueError:Graph disconnected:无法获得张量 KerasTensor

如何解决Keras,模型训练成功,但生成预测给出 ValueError:Graph disconnected:无法获得张量 KerasTensor

我为文本摘要创建了一个 Seq2Seq 模型。我有两种模型,一种有注意力,一种没有。没有注意力的人能够产生预测,但我不能为有注意力的人做预测,即使它成功地拟合了。

这是我的模型:

latent_dim = 300
embedding_dim = 200

clear_session()

# Encoder
encoder_inputs = Input(shape=(max_text_len,))

# Embedding layer
enc_emb = Embedding(x_voc,embedding_dim,trainable=True)(encoder_inputs)

# Encoder LSTM 1
encoder_lstm1 = Bidirectional(LSTM(latent_dim,return_sequences=True,return_state=True,dropout=0.4,recurrent_dropout=0.4))
(encoder_output1,forward_h1,forward_c1,backward_h1,backward_c1) = encoder_lstm1(enc_emb)

# Encoder LSTM 2
encoder_lstm2 = Bidirectional(LSTM(latent_dim,recurrent_dropout=0.4))
(encoder_output2,forward_h2,forward_c2,backward_h2,backward_c2) = encoder_lstm2(encoder_output1)

# Encoder LSTM 3
encoder_lstm3 = Bidirectional(LSTM(latent_dim,recurrent_dropout=0.4))
(encoder_outputs,forward_h,forward_c,backward_h,backward_c) = encoder_lstm3(encoder_output2)

state_h = Concatenate()([forward_h,backward_h])
state_c = Concatenate()([forward_c,backward_c])

# Set up the decoder,using encoder_states as the initial state
decoder_inputs = Input(shape=(None,))

# Embedding layer
dec_emb_layer = Embedding(y_voc,trainable=True)
dec_emb = dec_emb_layer(decoder_inputs)


# Decoder LSTM
decoder_lstm = LSTM(latent_dim*2,recurrent_dropout=0.2)
(decoder_outputs,decoder_fwd_state,decoder_back_state) = \
    decoder_lstm(dec_emb,initial_state=[state_h,state_c])

#start Attention part
attention = dot([decoder_outputs,encoder_outputs],axes=[2,2])
attention = Activation('softmax')(attention)
context = dot([attention,1])
decoder_outputs = Concatenate()([context,decoder_outputs])
#end Attention

# Dense layer
decoder_dense = Timedistributed(Dense(y_voc,activation='softmax'))(decoder_outputs)

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

这是如何构建用于生成预测的编码器和解码器:

model = load_model("model_intro.h5")

encoder_inputs = model.input[0]  # input_1

encoder_outputs,backward_c = model.layers[5].output #Bi-lstm2

state_h_enc = Concatenate()([forward_h,backward_h])
state_c_enc = Concatenate()([forward_c,backward_c])

encoder_states = [state_h_enc,state_c_enc]
encoder_model = Model(encoder_inputs,encoder_states)

decoder_inputs = model.input[1]  # input_2
decoder_state_input_h = Input(shape=(latent_dim*2,),name="input_3")
decoder_state_input_c = Input(shape=(latent_dim*2,name="input_4")
decoder_states_inputs = [decoder_state_input_h,decoder_state_input_c]
decoder_emdedding = model.layers[6](decoder_inputs)
decoder_lstm = model.layers[9]
decoder_outputs,state_h_dec,state_c_dec = decoder_lstm(decoder_emdedding,initial_state=decoder_states_inputs)
decoder_states = [state_h_dec,state_c_dec]

#start Attention
attention = dot([decoder_outputs,2])
attention2 = Activation('softmax')(attention)
context = dot([attention2,1])
decoder_outputs = Concatenate(axis=-1)([context,decoder_outputs])
#end Attention

decoder_dense = model.layers[-1]
decoder_outputs = decoder_dense(decoder_outputs)
decoder_model = Model(
    [decoder_inputs] + decoder_states_inputs,[decoder_outputs] + decoder_states
)

代码中,如果我删除了注意力部分,它就可以正常工作。在代码中,我添加了注意力开始和结束的注释。具有注意力的模型也成功拟合,但是,在构建用于生成预测的编码器和解码器时,我得到:

ValueError: Graph disconnected: cannot obtain value for tensor KerasTensor(type_spec=TensorSpec(shape=(None,300),dtype=tf.float32,name='input_1'),name='input_1',description="created by layer 'input_1'") at layer "embedding". The following prevIoUs layers were accessed without issue: []

这是我的模型的样子:

model

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。