2016-03-26 18 views
6

医療画像アプリケーションでは、TensorFlowでCNNをトレーニングしています。各繰り返し(TensorFlow)後に処理時間が長くなります。

私は大量のデータを持っていないので、トレーニングループ中にトレーニングバッチに無作為に修正を加えてトレーニングデータセットを人工的に増やそうとしています。私は別のスクリプトで次の機能を作成し、トレーニングバッチで呼び出しました。

def randomly_modify_training_batch(images_train_batch, batch_size): 

    for i in range(batch_size): 
     image = images_train_batch[i] 
     image_tensor = tf.convert_to_tensor(image) 

     distorted_image = tf.image.random_flip_left_right(image_tensor) 
     distorted_image = tf.image.random_flip_up_down(distorted_image) 
     distorted_image = tf.image.random_brightness(distorted_image, max_delta=60) 
     distorted_image = tf.image.random_contrast(distorted_image, lower=0.2, upper=1.8) 

     with tf.Session(): 
      images_train_batch[i] = distorted_image.eval() # .eval() is used to reconvert the image from Tensor type to ndarray 

return images_train_batch 

コードは自分の画像に変更を加えるのに適しています。

問題がある:私のトレーニングループ(フィードフォワード+バックプロパゲーション)の各反復後

、着実に前回より5秒長い時間がかかります私の次の研修バッチにこれと同じ機能を適用します。

10回以上の反復処理後に処理に1秒かかり、処理に1分以上かかります。

この原因は何ですか? どうすればそれを防ぐことができますか?

(私は "distorted_image.eval()"と思っていますが、わかりません。毎回新しいセッションを開いていますか?TensorFlowは、 "with tf" .Session() "ブロック?)

+0

[TensorFlow:入力時のグラデーションを取得するときのパフォーマンスが遅くなる可能性があります。](0120-338-501) – etarion

答えて

6

各反復でこのコードを呼び出すため、各繰り返しでこれらの操作をグラフに追加します。あなたはそれをしたくありません。最初にグラフを作成し、トレーニングループでのみ実行します。また、TFグラフに一度入れてからテンソルを使っているのではなく、なぜ後でndimageに変換する必要がありますか?

+0

matplotlib.pyplotで画像を視覚化できるように、画像をndarrayにコピーします。 TensorFlowの新機能はあまりにも新しすぎるかもしれませんが、私はTensorBoardがデータセットを選択的に視覚化する最も便利な方法ではないと感じました。 – Julep

+1

@Julep必要に応じて、トレーニングテンソルの結果をトレーニングループで要求することで、テンソルチェーンを壊すことなくイメージを取得することもできます(sess.run([train_op、loss ])) - 入力バッチも尋ねれば、それをndarrayとして取得し、その時点で可視化することができます。 – etarion

関連する問題