私はNumPy配列を持っていて、Queueを使ってTensorFlowのコードでそれを読みたいと思っています。私はキュー全体のデータをシャッフルし、指定された数のエポックを返すようにし、その後にエラーをスローします。例のサイズや例の数をハードコードする必要がないのが最善でしょう。 私はshuffle batchがその目的を果たすことを意図していると思います。次のように私はそれを使用して試してみました:テンソルフローにnumpy配列を渡す
data = tf.constant(train_np) # train_np is my numpy array of shape (num_examples, example_size)
batch = tf.train.shuffle_batch([data], batch_size=5, capacity=52200, min_after_dequeue=10, num_threads=1, seed=None, enqueue_many=True)
sess.run(tf.initialize_all_variables())
tf.train.start_queue_runners(sess=sess)
batch.eval()
そのアプローチの問題点は、それが継続的にすべてのデータを読み込み、私はエポックのいくつかの番号の後に終了することを指定することができないということです。私はRandomShuffleQueueを使用してデータを数回挿入することができることを知っていますが、 a)私はエポック*メモリのデータを浪費したくありませんし、b)キューがエポック間をシャッフルできるようにします。
独自のキューを作成しなくても、Tensorflowのエポックでシャッフルされたデータを読み込む良い方法はありますか?
どのように動作するか(ドキュメントを指している可能性があります)についてもう少し詳しく説明できますか? 特に:別のスレッドを作成し、そこにすべての要素num_epochsをエンキューすると、あまりにも多くのメモリが使用されないのはなぜですか? そして、なぜFIFOキューに複数回データをエンキューすると、要素が混在するのでしょうか? 1つのエポックが終わり、もう1つのエポックが始まるときだけでしょうか? また、 'num_epochs'回のコード全体を呼び出すことは、「データを読む良い方法」とはまったく異なります。P – sygi
キューの容量が10であれば、一度に10個の例のスペースしか必要とせず、非同期以前の例が使用されているので、キューのロードにより多くの例が追加されます。 (shuffle_batch)によって作成された2番目のキューは、エポックがどこで終了するかを知らないため、エポックからの最後のバッチには次のエポックからのエントリも含まれている可能性があります。 –
キューのドキュメントは[こちら](https://www.tensorflow.org/versions/r0.10/how_tos/threading_and_queues/index.html)、[こちら](http://yaroslavvb.blogspot.com/ 2016/05/queues-in-tensorflow.html)は、私が彼らに与えた話からのスライドです。 –