2017-02-17 12 views
1

交通標識画像を使用してテンソルフローを使用してニューラルネットワーク(LeNet)をトレーニングしようとしています。私は前処理技術がnnの性能に及ぼす影響を確認したい。そこで、私は画像を前処理し、結果(トレーニング画像、検証画像、テスト画像、最終的なテスト画像)を辞書に入れたタプルとして保存しました。入力データを変更する際のTensorflowモデルのトレーニングがありません

def evaluate(X_data, y_data): 
    num_examples = len(X_data) 
    total_accuracy = 0 
    sess = tf.get_default_session() 
    for offset in range(0,num_examples, BATCH_SIZE): 
     batch_x, batch_y = X_data[offset:offset+BATCH_SIZE], y_data[offset:offset+BATCH_SIZE] 
     accuracy = sess.run(accuracy_operation, feed_dict = {x:batch_x, y:batch_y}) 
     total_accuracy += (accuracy * len(batch_x)) 
    return total_accuracy/num_examples 

を次のように私はプログラムを実行すると、私はこの辞書を反復処理し、その後

import tensorflow as tf 
from sklearn.utils import shuffle 


output_data = [] 
EPOCHS = 5 
BATCH_SIZE = 128 
rate = 0.0005 

for key in finalInputdata.keys(): 
    for procTypes in range(0,(len(finalInputdata[key]))): 
     if np.shape(finalInputdata[key][procTypes][0]) !=(): 
      X_train = finalInputdata[key][procTypes][0] 
      X_valid = finalInputdata[key][procTypes][1] 
      X_test = finalInputdata[key][procTypes][2] 
      X_finaltest = finalInputdata[key][procTypes][3] 


      x = tf.placeholder(tf.float32, (None, 32, 32,np.shape(X_train)[-1])) 
      y = tf.placeholder(tf.int32, (None)) 
      one_hot_y = tf.one_hot(y,43) 

      # Tensor Operations 
      logits = LeNet(x,np.shape(X_train)[-1]) 

      cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits,one_hot_y) 
      softmax_probability = tf.nn.softmax(logits) 

      loss_operation = tf.reduce_mean(cross_entropy) 
      optimizer = tf.train.AdamOptimizer(learning_rate=rate) 
      training_operation = optimizer.minimize(loss_operation) 
      correct_prediction = tf.equal(tf.argmax(logits,1), tf.argmax(one_hot_y,1)) 
      accuracy_operation = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 


       # Pipeline for training and evaluation 

      sess = tf.InteractiveSession() 

      sess.run(tf.global_variables_initializer()) 
      num_examples = len(X_train) 

      print("Training on %s images processed as %s" %(key,dict_fornames['proctypes'][procTypes])) 
      print() 
      for i in range(EPOCHS): 
       X_train, y_train = shuffle(X_train, y_train) 
       for offset in range(0, num_examples, BATCH_SIZE): 
        end = offset + BATCH_SIZE 
        batch_x, batch_y = X_train[offset:end], y_train[offset:end] 
        sess.run(training_operation, feed_dict = {x: batch_x, y: batch_y}) 

       training_accuracy = evaluate(X_train,y_train) 

       validation_accuracy = evaluate(X_valid, y_valid) 

       testing_accuracy = evaluate(X_test, y_test) 

       final_accuracy = evaluate(X_finaltest, y_finalTest) 

       print("EPOCH {} ...".format(i+1)) 
       print("Training Accuracy = {:.3f}".format(training_accuracy)) 
       print("Validation Accuracy = {:.3f}".format(validation_accuracy)) 
       print() 
       output_data.append({'EPOCHS':EPOCHS, 'LearningRate':rate, 'ImageType': 'RGB',\ 
            'PreprocType': dict_fornames['proctypes'][0],\ 
            'TrainingAccuracy':training_accuracy, 'ValidationAccuracy':validation_accuracy, \ 
            'TestingAccuracy': testing_accuracy}) 


      sess.close() 

評価関数を次のようにtensorflowのトレーニングと検証操作を使用しようとした

ですそれはデータセットの最初の反復ではうまくいきますが、2回目の反復では、ネットワークはそれほど訓練を受けず、他のすべての反復でそれを続けます。

Training on RGB images processed as Original 

EPOCH 1 ... 
Training Accuracy = 0.525 
Validation Accuracy = 0.474 

EPOCH 2 ... 
Training Accuracy = 0.763 
Validation Accuracy = 0.682 

EPOCH 3 ... 
Training Accuracy = 0.844 
Validation Accuracy = 0.723 

EPOCH 4 ... 
Training Accuracy = 0.888 
Validation Accuracy = 0.779 

EPOCH 5 ... 
Training Accuracy = 0.913 
Validation Accuracy = 0.795 

Training on RGB images processed as Mean Subtracted Data 

EPOCH 1 ... 
Training Accuracy = 0.056 
Validation Accuracy = 0.057 

EPOCH 2 ... 
Training Accuracy = 0.057 
Validation Accuracy = 0.057 

EPOCH 3 ... 
Training Accuracy = 0.057 
Validation Accuracy = 0.056 

EPOCH 4 ... 
Training Accuracy = 0.058 
Validation Accuracy = 0.056 

EPOCH 5 ... 
Training Accuracy = 0.058 
Validation Accuracy = 0.058 

Training on RGB images processed as Normalized Data 

EPOCH 1 ... 
Training Accuracy = 0.058 
Validation Accuracy = 0.054 

EPOCH 2 ... 
Training Accuracy = 0.058 
Validation Accuracy = 0.054 

EPOCH 3 ... 
Training Accuracy = 0.058 
Validation Accuracy = 0.054 

EPOCH 4 ... 
Training Accuracy = 0.058 
Validation Accuracy = 0.054 

EPOCH 5 ... 
Training Accuracy = 0.058 
Validation Accuracy = 0.054 

ただし、カーネルを再起動して任意のデータ型(反復)を使用すると動作します。私は、グラフをクリアするか、複数のデータ型に対して複数のセッションを実行する必要があることを理解しましたが、それを行う方法はまだわかりません。私はtf.reset_default_graph()を使ってみましたが、何の効果もないようです。誰かが私を正しい方向に向けることができますか?あなたはそれをネットワークに供給する前に、ゼロ平均と単位分散に正規化されたデータ、例えばと試みるようにしたいかもしれません

おかげ

+0

問題の詳細について具体的に教えてください。 – drpng

+1

タイトルですでに述べたように、ネットワークは訓練を受けていません。トレーニングの正確さは、多くの反復後でさえも0.05である – Mechanic

答えて

1

画像を-1..1の範囲にスケーリングします。それは、0..1の範囲はほとんど同様にうまくいくと言います。ネットワークで使用されているアクティベーションに応じて、値の範囲によってすべての違いが生まれます。たとえば、ReLUsはゼロ未満の入力に対して消滅し、値が-4または+4を下回るとシグモイドが飽和し始め、tanhのアクティベーションが半減するその値の範囲が0以下にならない場合は値の範囲 - 値の範囲が大きすぎると、グラデーションが爆発し、トレーニングが完全に妨げられることがあります。 this paperから、著者は値の範囲平均の代わりに(バッチ)イメージ平均を引くように見える。

小規模のの学習率も試してみることができます(個人的には、私は通常アダムの場合0.0001を試し始めます)。

質問の複数のセッションについては、現在あなたのコードで実装されている方法では、基本的にはデフォルトのグラフが混乱しています。

for key in finalInputdata.keys(): 
    for procTypes in range(0,(len(finalInputdata[key]))): 
     if np.shape(finalInputdata[key][procTypes][0]) !=(): 

    # ... 

    x = tf.placeholder(tf.float32, (None, 32, 32,np.shape(X_train)[-1])) 
    y = tf.placeholder(tf.int32, (None)) 
    one_hot_y = tf.one_hot(y,43) 

    # Tensor Operations 
    logits = LeNet(x,np.shape(X_train)[-1]) 

    # ... etc ... 

を呼び出すことによって、あなたはすべてのデフォルトのグラフの中に、LeNetのlen(finalInputdata) * N異なるインスタンスを作成しています。これは、変数がネットワークで内部的に再利用されている場合に問題となる可能性があります。

あなたが別のハイパーを試みるためにあなたのデフォルトグラフをリセットしたいならば、

for key in finalInputdata.keys(): 
    for procTypes in range(0,(len(finalInputdata[key]))): 

     tf.reset_default_graph() 
     # define the graph 

     sess = tf.InteractiveSession() 
     # train 

を試みるが、明示的にそうようなグラフとのセッションを作成するために、おそらくより良いです:

for key in finalInputdata.keys(): 
    for procTypes in range(0,(len(finalInputdata[key]))): 

     with tf.Graph().as_default() as graph: 
      # define the graph 

     with tf.Session(graph=graph) as sess: 
      # train 

sess = tf.get_default_session()の代わりに、sessの参照を直接使用します。

また、JupyterカーネルとGPU対応のTensorFlowは、ネットワーク上で反復処理をしたり、メモリ不足のエラーが発生したり、ブラウザタブを完全にクラッシュさせたりすることもありません。

関連する問題