テンソルフロー seq2seq にキュー リーダーを適用して、データセット全体をメモリに読み込まないようにし、それらすべてを事前に処理しました。最初にデータセットを異なるバケット ファイルにバケット化することはしませんでした。これは、バッチごとに 1 つのバケット サイズを確保するのにも多くの時間がかかることを保証するためです。結果として、キュー リーダーからのデータの各バッチには、異なるバケット サイズのシーケンスが含まれている可能性があり、元の seq2seq モデルの実行に失敗する可能性があります (1 つのバッチ内のデータが同じバケット サイズであると仮定し、実行するバケットサイズに応じて 1 つのサブグラフ)
私が試したこと:
元の実装では、バケットと同じ数のサブグラフが構築され、同じパラメーターを共有していました。それらの唯一の違いは、RNN プロセス中に実行する必要がある計算時間です。サブグラフを条件付きグラフに変更しました。これは、switch
が True の場合、bucket_loss
このバケットの を計算して に追加しloss_list
、switch
が False の場合、何もせずに に追加tf.constant(0.0)
しloss_list
ます。最後に、total_loss = tf.reduce_sum(loss_list)
すべての損失を収集し、その上に勾配グラフを作成します。switches_list
また、すべてのステップでモデルにフィードします。のサイズはswitches_list
バケットのサイズと同じであり、このバッチに i 番目のバケット サイズのデータがある場合、対応する i 番目のスイッチはswitches_list
True になり、そうでない場合は False になります。
発生した問題:
- バックプロパゲーション プロセスが
tf.cond(...)
ノードを通過したとき、gradient.py
いくつかのスパース テンソルが密テンソルに変換されるという警告が表示されました。 total_loss
orをフェッチしようとすると、次のbucket_loss
ように言われました。
ValueError: Operation u'cond/model_with_one_buckets/sequence_loss/truediv' has been marked as not fetchable.
助けてください:
- 上記の2つの問題を解決するにはどうすればよいですか?
- 要件を満たすためにグラフをどのように変更すればよいですか?
- 1 つのバッチで異なるバケットサイズのデータをトレーニングするためのより良いアイデアはありますか?
- 最初にデータセット全体をバケット化せずに、非同期キュー リーダーを seq2seq フレームワークに適用するためのより良いアイデアはありますか?