我最近在学习之前慕课网 上的“NLP实践 ,基于TensorFlow打造聊天机器人”的这门课程,代码是根据视频中老师的写法照搬下来的。
代码运行至这里时出现问题
if not self.use_beamsearch_decode:
dod = self.decoder_outputs_decode
self.decoder_pred_decode = tf.transpose(
self.decoder_pred_decode, (1, 0)
)
else:
self.decoder_pred_decode = self.decoder_outputs_decode.predicted_ids
if self.time_major:
self.decoder_pred_decode = tf.transpose(
self.decoder_pred_decode, (1, 0, 2)
)
self.decoder_pred_decode = tf.transpose(
self.decoder_pred_decode,
perm=[0, 2, 1]
)
dod = self.decoder_outputs_decode
self.beam_prob = dod.beam_search_decoder_output.scores
在上述代码运行时会提示我
File "D:\ComputerProgram\AndroidWorkSpace\BAIYUN_MS\AIproject_NLP_chatbot\sequence_to_sequence.py", line 659, in build_decoder
self.decoder_pred_decode, (1, 0)
AttributeError: 'Seq2Seq' object has no attribute 'decoder_pred_decode'
思考了很久不知道这是为什么,求大佬告知,下附build decoder完整代码
def build_decoder(self, encoder_outputs, encoder_state):
with tf.variable_scope('decoder') as decoder_scope:
(
self.decoder_cell,
self.decoder_initial_state
) = self.build_decoder_cell(encoder_outputs, encoder_state)
with tf.device(_get_embed_device(self.target_vocab_size)):
if self.share_embedding:
self.decoder_embeddings = self.encoder_embeddings
elif self.pretrained_embedding:
self.decoder_embeddings = tf.Variable(
tf.constant(
0.0,
shape=(self.target_vocab_size,
self.embedding_size)
),
trainable=True,
name='embeddings'
)
self.decoder_embeddings_placeholder =tf.placeholder(
tf.float32,
(self.target_vocab_size, self.embedding_size)
)
self.decoder_embeddings_init = self.decoder_embeddings.assign(self.decoder_embeddings_placeholder)
else:
self.decoder_embeddings = tf.get_variable(
name='embedding',
shape=(self.target_vocab_size, self.embedding_size),
initializer=self.initializer,
dtype=tf.float32
)
self.decoder_output_projection = layers.Dense(
self.target_vocab_size,
dtype=tf.float32,
use_bias=False,
name='decoder_output_projection'
)
if self.mode == 'train':
self.decoder_inputs_embdedded = tf.nn.embedding_lookup(
params=self.decoder_embeddings,
ids=self.decoder_inputs_train
)
inputs = self.decoder_inputs_embdedded
if self.time_major:
inputs = tf.transpose(inputs, (1, 0, 2))
training_helper = seq2seq.TrainingHelper(
inputs=inputs,
sequence_length=self.decoder_inputs_length,
time_major=self.time_major,
name='training_helper'
)
training_decoder = seq2seq.BasicDecoder(
cell=self.decoder_cell,
helper=training_helper,
initial_state=self.decoder_initial_state
)
max_decoder_length = tf.reduce_max(
self.decoder_inputs_length
)
(
outputs,
self.final_state,
_
) = seq2seq.dynamic_decode(
decoder=training_decoder,
output_time_major=self.time_major,
impute_finished=True,
maximum_iterations=max_decoder_length,
parallel_iterations=self.parallel_iterations,
swap_memory=True,
scope=decoder_scope
)
self.decoder_logits_train = self.decoder_output_projection(
outputs.rnn_output
)
self.masks = tf.sequence_mask(
lengths=self.decoder_inputs_length,
maxlen=max_decoder_length,
dtype=tf.float32,
name='masks'
)
decoder_logits_train = self.decoder_logits_train
if self.time_major:
decoder_logits_train = tf.transpose(decoder_logits_train, (1, 0, 2))
self.decoder_pred_train = tf.argmax(
decoder_logits_train, axis=-1,
name='decoder_pred_train'
)
self.train_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
labels=self.decoder_inputs,
logits=decoder_logits_train)
self.masks_rewards = self.masks * self.rewards
self.loss_rewards = seq2seq.sequence_loss(
logits=decoder_logits_train,
targets=self.decoder_inputs,
weights=self.masks_rewards,
average_across_timesteps=True,
average_across_batch=True
)
self.loss = seq2seq.sequence_loss(
logits=decoder_logits_train,
targets=self.decoder_inputs,
weights=self.masks,
average_across_timesteps=True,
average_across_batch=True
)
self.add_loss = self.loss + self.add_loss
elif self.mode == 'decode':
start_token = tf.tile(
[WordSequence.START],
[self.batch_size]
)
end_token = WordSequence.END
def embed_and_input_proj(inputs):
return tf.nn.embedding_lookup(
self.decoder_embeddings,
inputs
)
if not self.use_beamsearch_decode:
decoder_helper = seq2seq.GreedyEmbeddingHelper(
start_tokens=start_token,
end_token=end_token,
embedding=embed_and_input_proj
)
inference_decoder = seq2seq.BasicDecoder(
cell=self.decoder_cell,
helper=decoder_helper,
initial_state=self.decoder_initial_state,
output_layer=self.decoder_output_projection
)
else:
inference_decoder = BeamSearchDecoder(
cell=self.decoder_cell,
embedding=embed_and_input_proj,
start_tokens=start_token,
end_token=end_token,
initial_state=self.decoder_initial_state,
beam_width=self.beam_width,
output_layer=self.decoder_output_projection
)
if self.max_decode_step is not None:
max_decoder_step = self.max_decode_step
else:
max_decoder_step = tf.round(tf.reduce_max(
self.encoder_inputs_length
) * 4)
(
self.decoder_outputs_decode,
self.final_state,
self.final_sequence_length
) = (seq2seq.dynamic_decode(
decoder=inference_decoder,
output_time_major=self.time_major,
maximum_iterations=max_decoder_step,
parallel_iterations=self.parallel_iterations,
swap_memory=True,
scope=decoder_scope
))
if not self.use_beamsearch_decode:
dod = self.decoder_outputs_decode
self.decoder_pred_decode = tf.transpose(
self.decoder_pred_decode, (1, 0)
)
else:
self.decoder_pred_decode = self.decoder_outputs_decode.predicted_ids
if self.time_major:
self.decoder_pred_decode = tf.transpose(
self.decoder_pred_decode, (1, 0, 2)
)
self.decoder_pred_decode = tf.transpose(
self.decoder_pred_decode,
perm=[0, 2, 1]
)
dod = self.decoder_outputs_decode
self.beam_prob = dod.beam_search_decoder_output.scores