2016-12-02 12 views
0

テンソルフローでネットワークをトレーニングするためにTFrecordファイルを使用しようとしています。問題は、それが正常に実行され始めていることですが、しばらくすると、それは本当に遅くなります。 GPUの使用率は、しばらくの間0%になります。 私は反復の間の時間を測定しており、明らかに増加しています。 私は、これが、訓練ループ内のグラフに操作を追加すること、およびgraph.finalize()を使用して解決できる理由を読んだことがあります。TFrecordsでの学習は徐々に遅くなります

self.inputMR_,self.CT_GT_ = read_and_decode_single_example("data.tfrecords") 

    self.inputMR, self.CT_GT = tf.train.shuffle_batch([self.inputMR_, self.CT_GT_], batch_size=self.batch_size, num_threads=2, 
     capacity=500*self.batch_size,min_after_dequeue=2000) 

    batch_size_tf = tf.shape(self.inputMR)[0] #variable batchsize so we can test here 
    self.train_phase = tf.placeholder(tf.bool, name='phase_train') 
    self.G = self.Network(self.inputMR,batch_size_tf)# create the network 
    self.g_loss=lp_loss(self.G, self.CT_GT, self.l_num, batch_size_tf) 
    print 'learning rate ',self.learning_rate 
    self.g_optim = tf.train.GradientDescentOptimizer(self.learning_rate).minimize(self.g_loss) 
    self.saver = tf.train.Saver() 

その後、私はこのようになります訓練段階があります:

私のコードは次のようである私はgrapgh.finalizeを追加すると

def train(self, config): 
    init=tf.initialize_all_variables() 
    with tf.Session() as sess: 
     sess.run(init) 

     coord = tf.train.Coordinator() 
     threads=tf.train.start_queue_runners(sess=sess, coord=coord) 
     sess.graph.finalize()# **WHERE SHOULD I PUT THIS?** 

     try: 

      while not coord.should_stop(): 
       _,loss_eval = sess.run([self.g_optim, self.g_loss],feed_dict={self.train_phase: True}) 
       ..... 

     except: 
      e = sys.exc_info()[0] 

      print "Exception !!!", e 
     finally: 
      coord.request_stop() 

     coord.join(threads) 
     sess.close() 

、言うexeptionがあります: type 'exceptions.RuntimeError' トレーニング中にTFrecordファイルを使用する正しい方法は何ですか?また、QueueRunnerの実行にintereferingせずにgraph.finalize()を使用する方法はありますか?

完全なエラーは次のとおりです。

File "main.py", line 37, in <module> 
    tf.app.run() 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/platform/app.py", line 30, in run 
    sys.exit(main(sys.argv[:1] + flags_passthrough)) 
    File "main.py", line 35, in main 
    gen_model.train(FLAGS) 
    File "/home/dongnie/Desktop/gan/TF_record_MR_CT/model.py", line 143, in train 
    self.global_step.assign(it).eval() # set and update(eval) global_step with index, i 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/variables.py", line 505, in assign 
    return state_ops.assign(self._variable, value, use_locking=use_locking) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_state_ops.py", line 45, in assign 
    use_locking=use_locking, name=name) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 490, in apply_op 
    preferred_dtype=default_dtype) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 657, in convert_to_tensor 
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/constant_op.py", line 180, in _constant_tensor_conversion_function 
    return constant(v, dtype=dtype, name=name) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/constant_op.py", line 167, in constant 
    attrs={"value": tensor_value, "dtype": dtype_value}, name=name).outputs[0] 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2337, in create_op 
    self._check_not_finalized() 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2078, in _check_not_finalized 
    raise RuntimeError("Graph is finalized and cannot be modified.") 
RuntimeError: Graph is finalized and cannot be modified. 
+0

通常、グラフを作成して確定してから、最初のsession.runコールを実行します。 RuntimeErrorの完全なスタックトレースを見ると便利です –

+0

Yaroslavに感謝します。QueueRunnerを使用すると問題が発生し、graph.finalizeがエラーを引き起こします。 完全なスタックトレースを印刷するにはどうすればよいですか? –

+0

つまり、 'exceptions.RuntimeError 'だけでなく、印刷されたものをコピーしてコピーします。 –

答えて

1

問題は、あなたがsession.run呼び出しの間にグラフを変更しているということです。グラフを修正している場所をピンポイントで指定するには、デフォルトのグラフ上でfinalizeを呼び出します。グラフの変更でエラーが発生します。あなたのケースでは、global_step.assign(it)を呼び出すことによってそれを変更しているようですが、そのたびに割り当てopが追加されます。代わりに、最初に呼び出して、結果を変数に保存し、その値を再利用する必要があります。

関連する問題