2017-04-06 7 views
3

こんにちは仲間テンソルフラワー TF1.0および1.1で開発およびリリースされている新しいseq2seqモジュールを使用してシーケンスモデルにシーケンスを実装しようとしています。 rnn_outputの形式でログを返すdynamic_decode関数hereがあります。 次に、rnnの出力を使って損失を計算する必要があります。 rnn_outputがはdynamiclyを形されているので、自然であるテンソルフローでは、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、重み、logits)でtf.contrib.seq2seq.loss.sequence_loss呼び出すことによって、それがでクラッシュ。 私は2つの可能な解を持っています: 1.最大許容長さに等しいサイズのテンソルに "パック"動的テンソル。固定テンソルのテンソルに動的テンソルをパックする方法はわかりませんが、動的シェイプの新しいインターフェイスであるtf.while_loopとTensorArraysを使用していると思います。そのことに関するいくつかのアドバイスを聞くことは素晴らしいことでしょう。 2. sequence_lossを動的に計算します。しかし、内部のテンソルフローの実装に関する私の知識は、それが簡単であるかどうかを正しく評価するにはあまりにも限定されています。ここに何か提案はありますか?

一般的な質問

はdynamic_decodeのdynamicaly状rnn_outputからサンプリング/正常ソフトマックスクロスエントロピー損失を計算するための適切なアプローチは何ですか?

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'

のpython:2.7

+0

この問題の解決方法を見つけましたか? – Deruijter

答えて

0

私はあなたがGreedyEmbeddingHelperを使用していると思いますか?トレーニング中は、TFの「TrainingHelper」を使用する必要があります。これまでのタイムステップでは、ターゲットが入力として使用されるため、出力ディメンションはターゲットディメンションと一致する必要があります。

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 

私が知っている、それは純粋に科学的ではありません。あなたの仕事のためにそれを形作る必要があります。それは単なるヒントです。

関連する問題