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 / тип инкубации).