2017-03-10 6 views
0

Ich habe gerade angefangen, Tensorflow zu lernen und implementierte ein neuronales Netzwerk für die lineare Regression. Ich habe einige der Online-Tutorials verfolgt, die in der Lage waren, den Code zu schreiben. Ich verwende keine Aktivierungsfunktion und verwende MSE (tf.reduce_sum(tf.square(output_layer - y))). Wenn ich den Code ausführe, bekomme ich Nan als Vorhersagegenauigkeit. Der Code, den ich verwendet, ist unten angegebenNeuronales Netzwerk für lineare Regression mit Tensorflow

# 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() 

Eine Beispielausgabe wird unter

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% 
gegeben

Jede Hilfe ist willkommen. Auch wenn Sie Debugging-Tipps geben können, die wirklich großartig wären.

Danke.

HINWEIS: Wenn ich für einzelne Charge ausführen, wird der vorhergesagte Wert zu groß

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]})) 

Ausgabe

[[ 1.64660544e+08]] 

HINWEIS: Wenn ich die learing_rate auf einen samll Wert (1e reduzieren -8), seine Art zu arbeiten. Dennoch, die höhere Lernrate funktionierte gut, wenn ich eine Regression für denselben Datensatz ausführte. Also war die hohe Lernrate das Problem hier?

Antwort

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

an dieser Linie, sind die Berechnung Sie die Summe jeder Tensor im Batch, wo die Charge eine Charge quadratische Abweichung ist.

Das ist in Ordnung, wenn Ihre Losgröße 1 (stochastische Gradientenabfallsaktualisierung) hat, statt, da Sie Mini-Batch Gradientenabfallsaktualisierung (Losgröße> 1) tun wollen, wanto Sie die durchschnittlichen Fehler über den Stapel zu minimieren .

So wollen Sie diese Funktion minimieren:

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

tf.reduce_mean den Mittelwert der Elemente in seinem Eingang berechnet.

Wenn die Stapelgröße 1 ist, verhält sich die Formel genau wie die zuvor verwendete. Wenn die Stapelgröße jedoch größer als 1 ist, wird der mittlere quadratische Fehler über den Stapel berechnet.

+0

Ich bin mit Batch-Größe von einem ausgeführt. Jedenfalls habe ich versucht, die von Ihnen vorgeschlagenen Änderungen vorzunehmen, aber der vorhergesagte Wert wird immer noch zu groß. Gibt es Fehler in dem Code, den ich geschrieben habe? – Faust

Verwandte Themen