2017-03-10 19 views
0

私はちょうどテンソルフローを学習し始め、線形回帰のためのニューラルネットワークを実装していました。私は利用可能なオンラインチュートリアルのいくつかに従っていたが、コードを書くことができた。私はアクティベーション機能を使用しておらず、MSE(tf.reduce_sum(tf.square(output_layer - y)))を使用しています。コードを実行すると予測精度がNanになります。私は使用されるコードは、サンプル出力は、すべてのヘルプが理解されるテンソルを使用した線形回帰のためのニューラルネットワーク

Epoch = 1, train accuracy = -2643642714558682640372224491520000.000000%, test accuracy = -2683751730046365038353121175142400.000000% 
Epoch = 1, train accuracy = 161895895004931631079134808611225600.000000%, test accuracy = 165095877160981392686228427295948800.000000% 
Epoch = 1, train accuracy = -18669546053716288450687958380235980800.000000%, test accuracy = -19281734142647757560839513130087219200.000000% 
Epoch = 1, train accuracy = inf%, test accuracy = inf% 
Epoch = 1, train accuracy = nan%, test accuracy = nan% 

下に与えられる

# Placeholders 
X = tf.placeholder("float", shape=[None, x_size]) 
y = tf.placeholder("float") 

w_1 = tf.Variable(tf.random_normal([x_size, 1], seed=seed)) 

output_layer = tf.matmul(X, w_1) 
predict = output_layer 

cost = tf.reduce_sum(tf.square(output_layer - y)) 
optimizer = tf.train.GradientDescentOptimizer(0.0001).minimize(cost) 

sess = tf.Session() 
init = tf.global_variables_initializer() 
sess.run(init) 


for epoch in range(100): 
     # Train with each example 
     for i in range(len(train_X)): 
      sess.run(optimizer, feed_dict={X: train_X[i: i + 1], y: train_y[i: i + 1]}) 

      train_accuracy = np.mean(sess.run(predict, feed_dict={X: train_X, y: train_y})) 
      test_accuracy = np.mean(sess.run(predict, feed_dict={X: test_X, y: test_y})) 

      print("Epoch = %d, train accuracy = %.2f%%, test accuracy = %.2f%%" 
      % (epoch + 1, 100. * train_accuracy, 100. * test_accuracy)) 


# In[121]: 

sess.close() 

以下に示します。また、本当に素晴らしいデバッグのヒントを提供できる場合は、

ありがとうございました。

注: 私はsamllの値にlearing_rateを減らす(1E:私は単一のバッチのために実行すると は、予測値が大きすぎる

sess.run(optimizer, feed_dict={X: train_X[0:1], y: train_y[0:1]}) 
sess.run(optimizer, feed_dict={X: train_X[1:2], y: train_y[1:2]}) 
sess.run(optimizer, feed_dict={X: train_X[2:3], y: train_y[2:3]}) 
print(sess.run(predict, feed_dict={X: train_X[3:4], y: train_y[3:4]})) 

出力

[[ 1.64660544e+08]] 

NOTEになってきています-8)、それはちょっとした仕事です。それでも、同じデータセットで回帰を実行していたときに、より高いlearing_rateがうまく動作しました。 このように高い評価率が問題でしたか?この行で

答えて

1
cost = tf.reduce_sum(tf.square(output_layer - y)) 

、あなたはバッチが乗差のバッチでバッチ、内のすべてのテンソルの合計を計算しています。

ミニバッチグラジエント降下(バッチサイズ> 1)を実行したいので、バッチに対して平均の平均値を小さくしたいので、バッチがサイズ1(確率的勾配降下) 。

したがって、あなたは、この機能を最小限にしたい:

cost = tf.reduce_mean(tf.square(output_layer - y)) 

tf.reduce_meanは、その入力の要素の平均値を計算します。

バッチサイズが1の場合、以前と同じように数式が動作しますが、バッチサイズが1より大きい場合は、バッチに対する平均平方誤差が計算されます。

+0

私は1つのバッチサイズで実行しています。とにかく、あなたが提案した変更を加えようとしましたが、それでも予測値が大きくなりすぎています。私が書いたコードに間違いはありますか? – Faust

関連する問題