tenssor flowはレンゲを使用しています。input_producerマルチスレッド読出しデータ例


キーコードを先に入れる:

i = tf.train.range_input_producer(NUM_EXPOCHES, num_epochs=1, shuffle=False).dequeue()
inputs = tf.slice(array, [i * BATCH_SIZE], [BATCH_SIZE])
原理解析:
第一のギルドでは、0からNUM_までの列が生成されます。EXPOCHES-1の元素が、num_ならepochsに指定があると、各元素はnum_のみを生成します。epochs回、さもなくば循環は発生します。shuffleは順番を狂わすかどうかを指定します。ここでshuffle=Falseはキューを表す要素は0からNUM_までです。EXPOCHES-1の順に格納します。Graphを実行する時、各スレッドはキューから要素を取り出し、仮に値iを仮定して、2行目のコードに従ってarrayの一部のデータをバッtchとして切ります。例えばNUM_EXPOCHES=3,もしnum_epochs=2なら、行列の内容はこのようです。
0,1,2,0,1,2
行列は6つの要素しかありません。このように訓練の時には6つのbatchしか生成できません。6回繰り返したら訓練は終わります。
もしnum_epochsが指定されていない場合、列の内容はこのようになります。
0、1、2、0、1、2、0、1、2、0、1、2…
キューは常に元素を生成して、トレーニングの時に無限のバッチが発生します。いつまで自分でコントロールしてトレーニングを停止しますか?
以下は完全なデモコードです。
データファイルtest.txt内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
mail.py内容:

import tensorflow as tf
import codecs
 
BATCH_SIZE = 6
NUM_EXPOCHES = 5
 
 
def input_producer():
 array = codecs.open("test.txt").readlines()
	array = map(lambda line: line.strip(), array)
 i = tf.train.range_input_producer(NUM_EXPOCHES, num_epochs=1, shuffle=False).dequeue()
 inputs = tf.slice(array, [i * BATCH_SIZE], [BATCH_SIZE])
 return inputs
 
 
class Inputs(object):
 def __init__(self):
  self.inputs = input_producer()
 
 
def main(*args, **kwargs):
 inputs = Inputs()
 init = tf.group(tf.initialize_all_variables(),
     tf.initialize_local_variables())
 sess = tf.Session()
 coord = tf.train.Coordinator()
 threads = tf.train.start_queue_runners(sess=sess, coord=coord)
 sess.run(init)
 try:
  index = 0
  while not coord.should_stop() and index<10:
   datalines = sess.run(inputs.inputs)
   index += 1
   print("step: %d, batch data: %s" % (index, str(datalines)))
 except tf.errors.OutOfRangeError:
  print("Done traing:-------Epoch limit reached")
 except KeyboardInterrupt:
  print("keyboard interrput detected, stop training")
 finally:
  coord.request_stop()
 coord.join(threads)
 sess.close()
 del sess
	
if __name__ == "__main__":
 main()
出力:

step: 1, batch data: ['1' '2' '3' '4' '5' '6']
step: 2, batch data: ['7' '8' '9' '10' '11' '12']
step: 3, batch data: ['13' '14' '15' '16' '17' '18']
step: 4, batch data: ['19' '20' '21' '22' '23' '24']
step: 5, batch data: ['25' '26' '27' '28' '29' '30']
Done traing:-------Epoch limit reached
ランジュならinput_producer抜きパラメータnum_epochs=1なら、出力:

step: 1, batch data: ['1' '2' '3' '4' '5' '6']
step: 2, batch data: ['7' '8' '9' '10' '11' '12']
step: 3, batch data: ['13' '14' '15' '16' '17' '18']
step: 4, batch data: ['19' '20' '21' '22' '23' '24']
step: 5, batch data: ['25' '26' '27' '28' '29' '30']
step: 6, batch data: ['1' '2' '3' '4' '5' '6']
step: 7, batch data: ['7' '8' '9' '10' '11' '12']
step: 8, batch data: ['13' '14' '15' '16' '17' '18']
step: 9, batch data: ['19' '20' '21' '22' '23' '24']
step: 10, batch data: ['25' '26' '27' '28' '29' '30']
ちょっと注意したいのですが、書類は全部で35本のデータがあります。BATCH_SIZE=6は各batchが6つのデータを含むことを示し、NUM_EXPOCHES=5は5つのbatchを生成することを表します。NUM_EXPOCHES=6なら、全部で36個のデータが必要です。以下のエラーを報告します。

InvalidArgumentError (see above for traceback): Expected size[0] in [0, 5], but got 6
 [[Node: Slice = Slice[Index=DT_INT32, T=DT_STRING, _device="/job:localhost/replica:0/task:0/cpu:0"](Slice/input, Slice/begin/_5, Slice/size)]]
エラーメッセージの意味は35/BATCH_です。SIZE=5、すなわちNUM_EXPOCHESの取得は0から5の間だけ可能です。
以上のこのtenssorflowはレンゲを使っています。input_producerマルチスレッドのデータ読み込みの例は、小編集が皆さんに共有している内容です。参考にしていただければと思います。よろしくお願いします。