2017-01-20 5 views
1

さまざまなサイズの隠れたレイヤーでニューラルネットワークを繰り返しトレーニングして、必要なニューロンの数を決定しようとしています。私は1つのパススルーを行うときにうまく動作するネットを書いた。コードは:Tensorflow:ループ内のループ内のプレースホルダーにエラーが発生しました

import tensorflow as tf 
import nn 

def train(layers, data, folder = 'run1'): 
    input_layer_size, hidden_layer_size, num_labels = layers; 
    X, y, X_val, y_val = data; 

    X_placeholder = tf.placeholder(tf.float32, shape=(None, input_layer_size), name='X') 
    y_placeholder = tf.placeholder(tf.uint8, shape=(None, num_labels), name='y') 
    Theta1 = tf.Variable(nn.randInitializeWeights(input_layer_size, hidden_layer_size), name='Theta1') 
    bias1 = tf.Variable(nn.randInitializeWeights(hidden_layer_size, 1), name='bias1') 
    Theta2 = tf.Variable(nn.randInitializeWeights(hidden_layer_size, num_labels), name='Theta2') 
    bias2 = tf.Variable(nn.randInitializeWeights(num_labels, 1), name='bias2') 
    cost = nn.cost(X_placeholder, y_placeholder, Theta1, bias1, Theta2, bias2) 
    optimize = tf.train.GradientDescentOptimizer(0.6).minimize(cost) 

    accuracy, precision, recall, f1 = nn.evaluate(X_placeholder, y_placeholder, Theta1, bias1, Theta2, bias2) 

    cost_summary = tf.summary.scalar('cost', cost); 
    accuracy_summary = tf.summary.scalar('accuracy', accuracy); 
    precision_summary = tf.summary.scalar('precision', precision); 
    recall_summary = tf.summary.scalar('recall', recall); 
    f1_summary = tf.summary.scalar('f1', f1); 
    summaries = tf.summary.merge_all(); 

    sess = tf.Session(); 
    saver = tf.train.Saver() 
    init = tf.global_variables_initializer() 
    sess.run(init) 

    writer = tf.summary.FileWriter('./tmp/logs/' + folder, sess.graph) 

    NUM_STEPS = 20; 

    for step in range(NUM_STEPS): 
     sess.run(optimize, feed_dict={X_placeholder: X, y_placeholder: y}); 
     if (step > 0) and ((step + 1) % 10 == 0): 
      summary = sess.run(summaries, feed_dict={X_placeholder: X_val, y_placeholder: y_val}); 
      # writer.add_summary(summary, step); 
      print('Step', step + 1, 'of', NUM_STEPS); 

    save_path = saver.save(sess, './tmp/model_' + folder + '.ckpt') 
    print("Model saved in file: %s" % save_path) 
    sess.close(); 

この呼び出しをループに入れても、私は最初の繰り返しだけにします。 2回目の反復の間に、私はこの行を打つ最初の時間を失敗するようだ:

summary = sess.run(summaries, feed_dict={X_placeholder: X_val, y_placeholder: y_val}); 

私はエラーを取得する:InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'X' with dtype float

私は右供給する前にXX_valの両方をログに記録し、彼らがやるように、彼らは正確に見えますそれぞれの前回の走行。私は2番目run一部というコメントをした場合、それは素晴らしい作品が、私はちょっと私の要約を必要とするから...

私の外側のループは次のようになります。

import train 
import loadData 

input_layer_size = 5513; 
num_labels = 128; 

data = loadData.load(input_layer_size, num_labels); 

for hidden_layer_size in range(50, 500, 50): 
    train.train([input_layer_size, hidden_layer_size, num_labels], data, 'run' + str(hidden_layer_size)) 

答えて

0

あなたは、各ループ内での列車の関数を呼び出しているのでそれが実行されると、プレースホルダの新しいコピーが作成されます。それが最初に実行されるのは、コピーが1つしかないためです。 2回目の実行時には、プレースホルダが重複しています。解決策は、トレーニングを実行するコードからモデルを構築するコードを分離することです。

+0

テンソルの周りに頭を巻きます。セッションを終了してもプレースホルダは何とかキャッシュされますか?私はこれを呼び出すたびに新しいセッションを作成して閉じるので、すべてが新鮮で破壊されてしまうことに気付きました。 –

+0

'tf.reset_default_graph()'を呼び出す必要があります。それ以外の場合、グラフはPythonランタイムに保存され、セッション終了の影響を受けません。 –

+0

トレーニングにセッションを1回使用します。トレーニングループ内に新しいセッションを作成しないでください。 – Aaron

関連する問題