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