tensorflow rnn_decoder对每个decoder_output执行softmax

时间:2017-08-16 04:44:25

标签: python tensorflow lstm google-cloud-ml-engine

我尝试为GCP ML Engine包编写自己的估算器model_fn()。我使用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)

我知道输出是"与2D张量的解码器输入长度相同的列表"但我想知道如何使用这个列表来计算整个序列的损失函数?

我知道如果我抓住输出[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 个答案:

答案 0 :(得分:1)

我认为你正在寻找sequence_loss(目前处于contrib /一种孵化模式)。

答案 1 :(得分:0)

我的问题的解决方案似乎是使用sequence_loss_by_example