tenorflow rnn_decoder выполняет softmax для каждого decoder_output

Я пытался написать свой собственный оценщик model_fn() для пакета GCP ML Engine. Я декодировал последовательность выходных данных, используя embedding_rnn_decoder, как показано ниже:

outputs, state = tf.contrib.legacy_seq2seq.embedding_rnn_decoder(
    decoder_inputs = decoder_inputs,
    initial_state = curr_layer,
    cell = tf.contrib.rnn.GRUCell(hidden_units),
    num_symbols = n_classes, 
    embedding_size = embedding_dims,
    feed_previous = False)

Я знаю, что output - это "список той же длины, что и decoder_inputs 2D Tensors", но мне интересно, как я могу использовать этот список для вычисления функции потерь для всей последовательности?

Я знаю, что если я получу выходные данные [0] (т.е. получу только первый вывод последовательности), то я могу потерять, выполнив следующее:

logits = tf.layers.dense(
    outputs[0],
    n_classes)
loss = tf.reduce_mean(
    tf.nn.sparse_softmax_cross_entropy_with_logits(
        logits=logits, labels=labels)

Целесообразно ли генерировать значение потерь для каждого из выходных элементов, а затем передавать все это в tf.reduce_mean? Это кажется неэффективным, особенно для длинных последовательностей - есть ли другие способы расчета softmax на каждом шаге последовательности, которые были бы более эффективными?

2 ответа

Решение

Похоже, что решение моей проблемы заключается в использовании sequence_loss_by_example

Я думаю, что вы ищете sequence_loss (в настоящее время в contrib / тип инкубации).

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