Beam Search Decoder выводит -1 в качестве прогноза (как это возможно?)

Когда я реализую Beam Search Decoder, его первое предсказание выдает -1 с несколькими временными шагами.

Я не понимаю, как это возможно, так как проекционному слою передается размер словаря, который индексируется от 0. Например, с помощью жадного декодера это явно невозможно, так как выходные данные являются индексом лучшего элемента в массив. Разве это больше не верно для Beam Search?

Когда я реализую Beam Search Decoder, он начинает с вывода -1 с несколькими временными шагами.

Я не понимаю, как это возможно, так как проекционному слою передается размер словаря, который индексируется с 0.

tf.set_random_seed(hparams.graph_seed)
source, target_in, target_out, weights, source_lengths, target_lengths = iterator.get_next()
true_batch_size = tf.size(source_lengths)

embedding_encoder = tf.get_variable("embedding_encoder", [hparams.src_vsize, hparams.src_emsize])
encoder_emb_inp = tf.nn.embedding_lookup(embedding_encoder, source)
embedding_decoder = tf.get_variable("embedding_decoder", [hparams.tgt_vsize, hparams.tgt_emsize])
decoder_emb_inp = tf.nn.embedding_lookup(embedding_decoder, target_in)

encoder_cell = tf.nn.rnn_cell.BasicLSTMCell(hparams.num_units)
encoder_outputs, encoder_state = tf.nn.dynamic_rnn(encoder_cell, encoder_emb_inp, sequence_length=source_lengths, dtype=tf.float32)

decoder_cell = tf.nn.rnn_cell.BasicLSTMCell(hparams.num_units)

encoder_outputs = tf.contrib.seq2seq.tile_batch(encoder_outputs, multiplier=hparams.beam_width)
source_lengths = tf.contrib.seq2seq.tile_batch(source_lengths, multiplier=hparams.beam_width)
                encoder_state = tf.contrib.seq2seq.tile_batch(encoder_state, multiplier=hparams.beam_width)

multiplier=hparams.beam_width)
batch_size = true_batch_size * hparams.beam_width
attention_mechanism = tf.contrib.seq2seq.LuongAttention(num_units=hparams.num_units,
                                                        memory=encoder_outputs,
                                                        memory_sequence_length=source_lengths,
                                                        scale=True)
decoder_cell = tf.contrib.seq2seq.AttentionWrapper(cell=decoder_cell,
                                                    attention_mechanism=attention_mechanism,
                                                    attention_layer_size=hparams.num_units)
decoder_initial_state = decoder_cell.zero_state(batch_size, tf.float32).clone(cell_state=encoder_state)

projection_layer = layers_core.Dense(units=hparams.tgt_vsize, use_bias=False)

decoder = tf.contrib.seq2seq.BeamSearchDecoder(cell=decoder_cell,
                                               embedding=embedding_decoder,
                                               start_tokens=tf.fill([true_batch_size], hparams.sos),
                                               end_token=hparams.eos,
                                               initial_state=decoder_initial_state,
                                               beam_width=hparams.beam_width,
                                               output_layer=projection_layer,
                                               length_penalty_weight=hparams.length_penalty_weight)

outputs, _, _ = tf.contrib.seq2seq.dynamic_decode(decoder, maximum_iterations=tf.reduce_max(target_lengths))
ids = outputs.predicted_ids

0 ответов

Другие вопросы по тегам