2017-08-16 50 views
1

我嘗試爲GCP ML Engine包編寫我自己的估計器model_fn()。餘解碼的使用embedding_rnn_decoder輸出的序列如下所示:tensorflow rnn_decoder在每個decoder_output上執行softmax

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張量的decoder_inputs的列表」,但我想知道如何可以使用該列表來計算整個序列的損失函數?

我知道,如果我搶輸出[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更高效?

+0

此信息是否有用? https://www.tensorflow.org/tutorials/seq2seq#sampled_softmax_and_output_projection – rhaertel80

+0

不,這沒有幫助。我的問題沒有通過採樣softmax解決。我的問題是我需要執行softmax的多次迭代(在RNN的每個輸出上)。我需要計算序列中每個步驟的損失(或採樣的softmax損失),這是我不確定如何正確執行此操作的地方。 – reese0106

回答

0

它看起來像解決我的問題是使用sequence_loss_by_example

+0

這是一個名爲「遺留」的包。我已經添加了一個非遺傳版本的鏈接,但是請注意,它也在contrib /(一種孵化)中。 – rhaertel80

+0

我正在使用「legacy」包生成我的輸出,所以舊版包似乎更適合用於此問題的度量標準 – reese0106

+0

保留在同一個包中可能是一個好主意。考慮在某個時候退出遺產。我懷疑他們不會使用錯誤修復或性能增強來更新它。 – rhaertel80

相關問題