さまざまなサイズの隠れたレイヤーでニューラルネットワークを繰り返しトレーニングして、必要なニューロンの数を決定しようとしています。私は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
私は右供給する前にX
とX_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))
テンソルの周りに頭を巻きます。セッションを終了してもプレースホルダは何とかキャッシュされますか?私はこれを呼び出すたびに新しいセッションを作成して閉じるので、すべてが新鮮で破壊されてしまうことに気付きました。 –
'tf.reset_default_graph()'を呼び出す必要があります。それ以外の場合、グラフはPythonランタイムに保存され、セッション終了の影響を受けません。 –
トレーニングにセッションを1回使用します。トレーニングループ内に新しいセッションを作成しないでください。 – Aaron