1

テンソルフロー seq2seq にキュー リーダーを適用して、データセット全体をメモリに読み込まないようにし、それらすべてを事前に処理しました。最初にデータセットを異なるバケット ファイルにバケット化することはしませんでした。これは、バッチごとに 1 つのバケット サイズを確保するのにも多くの時間がかかることを保証するためです。結果として、キュー リーダーからのデータの各バッチには、異なるバケット サイズのシーケンスが含まれている可能性があり、元の seq2seq モデルの実行に失敗する可能性があります (1 つのバッチ内のデータが同じバケット サイズであると仮定し、実行するバケットサイズに応じて 1 つのサブグラフ)

私が試したこと:

元の実装では、バケットと同じ数のサブグラフが構築され、同じパラメーターを共有していました。それらの唯一の違いは、RNN プロセス中に実行する必要がある計算時間です。サブグラフを条件付きグラフに変更しました。これは、switchが True の場合、bucket_lossこのバケットの を計算して に追加しloss_listswitchが False の場合、何もせずに に追加tf.constant(0.0)loss_listます。最後に、total_loss = tf.reduce_sum(loss_list)すべての損失を収集し、その上に勾配グラフを作成します。switches_listまた、すべてのステップでモデルにフィードします。のサイズはswitches_listバケットのサイズと同じであり、このバッチに i 番目のバケット サイズのデータ​​がある場合、対応する i 番目のスイッチはswitches_listTrue になり、そうでない場合は False になります。

発生した問題:

  1. バックプロパゲーション プロセスがtf.cond(...) ノードを通過したとき、gradient.pyいくつかのスパース テンソルが密テンソルに変換されるという警告が表示されました。
  2. total_lossorをフェッチしようとすると、次のbucket_lossように言われました。
ValueError: Operation u'cond/model_with_one_buckets/sequence_loss/truediv' has been marked as not fetchable.

助けてください:

  • 上記の2つの問題を解決するにはどうすればよいですか?
  • 要件を満たすためにグラフをどのように変更すればよいですか?
  • 1 つのバッチで異なるバケットサイズのデータ​​をトレーニングするためのより良いアイデアはありますか?
  • 最初にデータセット全体をバケット化せずに、非同期キュー リーダーを seq2seq フレームワークに適用するためのより良いアイデアはありますか?
4

1 に答える 1

0

私はバケツを完全に捨てます。dynamic_rnn を使用します。ここでのアイデアは、そのバッチがそのバッチのすべてのメンバーに対して等しい長さ (通常は、それぞれのバッチの最も長いメンバーのサイズ) で到着するために必要な数のパディング シンボルでバッチを埋めることです。4 つの質問すべてを解決しますが、そうです、書き直すのは面倒です。(全然後悔してないけど)

私は途中で私のケースとデータに非常に特殊な多くのことを行ったので、共有しても意味がありませんが、この実装をチェックしたいかもしれません: TensorFlow の可変シーケンス長

于 2016-10-20T07:44:26.477 に答える