4

仲間の tensorflowers さん、こんにちは。TF1.0 および 1.1 で開発およびリリースされている新しい seq2seq モジュールを使用して、シーケンスからシーケンスへのモデルを実装しようとしています。ここには、rnn_output の形式でロジットを返すdynamic_decode 関数があります。次に、rnn の出力を使用して損失を計算する必要があります。(rnn_output, weights, logits) で tf.contrib.seq2seq.loss.sequence_loss を呼び出すだけで、単純に実行すると、次のようにクラッシュします。

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 は動的に整形されているため、これは当然のことです。可能な解決策は 2 つあります。1. 動的テンソルを最大許容長に等しいサイズのテンソルに「パック」します。動的テンソルを固定サイズのテンソルにパックする方法はわかりませんが、おそらく動的形状の新しいインターフェイスである tf.while_loop と TensorArrays をうまく処理する必要があります。2. sequence_loss を動的に計算する。しかし、内部テンソルフローの実装に関する私の知識はあまりにも限られているため、それが簡単に実行できるかどうかを正しく評価できません。ここに何か提案はありますか?

一般的な質問

dynamic_decode の動的に整形された 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'

パイソン: 2.7

4

2 に答える 2

2

確かに 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

私は知っています、それは純粋に科学的ではありません。タスクに合わせて形作る必要があります。それは単なるヒントです。

于 2017-08-22T17:06:43.267 に答える
1

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

于 2017-08-02T21:29:29.293 に答える