2017-06-07 18 views
0

私はバッチ処理でモデルバッチを練習しようとしています。これは私ができる限り、Tensorflowでモデルバッチを一括して訓練する方法を見つける私の使命です。それはbatch_x,batch_y=sess.run([X_train_batch,y_train_batch])ラインを実行するときに永遠に立ち往生して出力Tensorflow:sess.runで永久にバッチ処理されたバッチ処理

queue=tf.FIFOQueue(capacity=50,dtypes=[tf.float32,tf.float32],shapes=[[10],[2]]) 
enqueue_op=queue.enqueue_many([X,Y]) 
dequeue_op=queue.dequeue() 

qr=tf.train.QueueRunner(queue,[enqueue_op]*2) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    X_train_batch,y_train_batch=tf.train.batch(dequeue_op,batch_size=2) 
    coord=tf.train.Coordinator() 
    enqueue_threads=qr.create_threads(sess,coord,start=True) 
    sess.run(tf.local_variables_initializer()) 
    for epoch in range(100): 
     print("inside loop1") 
     for iter in range(5): 
      print("inside loop2") 
      if coord.should_stop(): 
       break 
      batch_x,batch_y=sess.run([X_train_batch,y_train_batch]) 
      print("after sess.run") 
      print(batch_x.shape) 
      _=sess.run(optimizer,feed_dict={x_place:batch_x,y_place:batch_y}) 
     coord.request_stop() 
     coord.join(enqueue_threads) 

inside loop1 
inside loop2 

あなたが見ることができるように、 。 私はこれをどのように解決することができないのでしょうか、これはバッチでモデルバッチを訓練する適切な方法ですか?

+0

は本当に「LOOP1内部、ループ1内の」出力であるか、それは「LOOP1内部に、ループ2の内側」ですか?第2に、あなたの最後の2行はちょっとあまりインデントされていて、「エポック」行に合わせるべきです。 – Wontonimo

+0

申し訳ありませんが、今編集されていて、問題を編集して解決策を見つけました。 –

答えて

1

検索の数時間後、自分で解決策を見つけました。だから、今私自身の質問に答えています。 キューは、tf.train.start_queue_runners()を呼び出すと作成されるバックグラウンドスレッドによって満たされます。このメソッドを呼び出さないと、バックグラウンドスレッドは開始せず、キューは空のままで、トレーニングオペレーションは無期限に入力待ちをブロックします。

FIX: トレーニングループの直前にtf.train.start_queue_runners(sess)と呼んでください。 私は以下のように行った:

queue=tf.FIFOQueue(capacity=50,dtypes=[tf.float32,tf.float32],shapes=[[10],[2]]) 
enqueue_op=queue.enqueue_many([X,Y]) 
dequeue_op=queue.dequeue() 

qr=tf.train.QueueRunner(queue,[enqueue_op]*2) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    X_train_batch,y_train_batch=tf.train.batch(dequeue_op,batch_size=2) 
    coord=tf.train.Coordinator() 
    enqueue_threads=qr.create_threads(sess,coord,start=True) 
    tf.train.start_queue_runners(sess) 
    for epoch in range(100): 
     print("inside loop1") 
     for iter in range(5): 
      print("inside loop2") 
      if coord.should_stop(): 
       break 
      batch_x,batch_y=sess.run([X_train_batch,y_train_batch]) 
      print("after sess.run") 
      print(batch_x.shape) 
      _=sess.run(optimizer,feed_dict={x_place:batch_x,y_place:batch_y}) 
     coord.request_stop() 
     coord.join(enqueue_threads)