データセット内のクラスごとに 1 つのシリアル化されたファイルがあります。キューを使用してこれらの各ファイルをロードし、それらを RandomShuffleQueue に配置して、各クラスからサンプルをランダムに組み合わせて取得したいと考えています。このコードはうまくいくと思いました。
この例では、各ファイルに 10 個の例があります。
filenames = ["a", "b", ...]
with self.test_session() as sess:
# for each file open a queue and get that
# queue's results.
strings = []
rq = tf.RandomShuffleQueue(1000, 10, [tf.string], shapes=())
for filename in filenames:
q = tf.FIFOQueue(99, [tf.string], shapes=())
q.enqueue([filename]).run()
q.close().run()
# read_string just pulls a string from the file
key, out_string = input_data.read_string(q, IMAGE_SIZE, CHANNELS, LABEL_BYTES)
strings.append(out_string)
rq.enqueue([out_string]).run()
rq.close().run()
qs = rq.dequeue()
label, image = input_data.string_to_data(qs, IMAGE_SIZE, CHANNELS, LABEL_BYTES)
for i in range(11):
l, im = sess.run([label, image])
print("L: {}".format(l)
これは 10 回の呼び出しでは正常に機能しますが、11 回目にはキューが空であると表示されます。
これは、これらのキューが動作する対象についての私の誤解によるものだと思います。に 10 個の変数を追加しますがRandomShuffleQueue
、これらの各変数はそれ自体がキューからプルされるため、各ファイル キューが空になるまでキューが空にならないと想定しました。
ここで何が間違っていますか?