2017-04-06 196 views
3

嗨同胞tensorflowers, 我想實現一個序列模型使用新的seq2seq模塊正在開發和發佈與TF1.0和1.1。 有dynamic_decode函數here返回rnn_output形式的logits。 然後,我需要使用rnn的輸出來計算損失。 當我天真地運行它,只是通過調用tf.contrib.seq2seq.loss.sequence_loss用(rnn_output,重量logits),它崩潰了:在tensorflow中,如何使用dynamic_decode輸出計算序列損失

InvalidArgumentError (see above for traceback): Incompatible shapes: [1856,1,1024] vs. [9600,1,1024] 
     [[Node: optimize/gradients/loss/sequence_loss/sampled_softmax_loss/Mul_grad/BroadcastGradientArgs = BroadcastGradientArgs[T=DT_INT32, _device="/job:localhost/replica:0/task:0/gpu:0"](optimize/gradients/loss/sequence_loss/sampled_softmax_loss/Mul_grad/Shape/_3099, optimize/gradients/loss/sequence_loss/sampled_softmax_loss/Mul_grad/Shape_1/_3101)]] 
     [[Node: optimize/gradients/Add/_824 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/gpu:3", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_2787_optimize/gradients/Add", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:3"](^_cloopMainDynamicDecoderWithAttention/decoder/decoder/while/BasicDecoderStep/multi_rnn_cell/cell_1/multi_rnn_cell/cell_2/lstm_cell/zeros/_128)]] 

這是自然的,因爲rnn_output是動態地形。 我有兩種可能的解決方案: 1.將「張力」動態張量轉化爲等於最大允許長度的張量。我不知道如何將動態張量打包成一個固定大小的張量,但它可能必須對動態形狀的新界面進行修改:tf.while_loop和TensorArrays。能聽到關於 的一些建議會很好2.動態計算sequence_loss。但是我對內部張量流執行的知識太有限,無法正確評估它是否容易做到。這裏有什麼建議?

的一般問題

什麼是計算從採樣的dynamic_decode形dynamicaly rnn_output /正常SOFTMAX交叉熵損失正確的方法?

我有以下代碼:

decoder_outputs, decoder_state = seq2seq.dynamic_decode(my_decoder, output_time_major=False, parallel_iterations=512, 
        swap_memory = True) 

self.logits = decoder_outputs.rnn_output 
self.loss = loss.sequence_loss(self.logits, tf.transpose(tf.stack(targets), [1,0], name="targets_"), 
               tf.transpose(tf.stack(self.target_weights), [1,0], name="weights_"), 
               softmax_loss_function = softmax_loss_function) 

IPDB> TF。 版本 '1.1.0-RC0'

蟒蛇:2.7

+0

您是否設法找到解決此問題的一些解決方案? – Deruijter

回答

0

我猜你正在使用GreedyEmbeddingHelper?在訓練期間,你應該使用TF的「訓練助手」。輸出維度應與您的目標維度相匹配,因爲在任何時間步驟,目標都將用作輸入。

0

當然,這是tf.contrib.seq2seq.loss.sequence_loss的麻煩。 如果您使用動態RNN並且不手動展開您的BPTT,則可以使用更簡單的丟失功能。

我所做的,基本上是:

loss = tf.reduce_sum(
    tf.nn.sparse_softmax_cross_entropy_with_logits(
     labels=self.answers, 
     logits=presoftmax 
    ) 
)/self.batch_sz 

我知道,這不是純粹的科學。你需要爲你的任務塑造它。這只是一個提示。