Ich versuche, ein sehr grundlegendes neurales Netz in TensorFlow zu implementieren, aber ich habe einige Probleme. Es ist ein sehr einfaches Netzwerk, das als Eingabe für Werte (Stunden oder Schlaf und Stunden des Studiums) dient und das Ergebnis eines Tests vorhersagt (ich habe dieses Beispiel auf you-tube gefunden). Also im Grunde habe ich nur eine versteckte Schicht mit drei Einheiten, jede berechnet eine Aktivierungsfunktion (Sigmoid) und die Kostenfunktion ist die Summe der quadratischen Fehler und ich benutze Gradientenabstieg, um sie zu minimieren. Das Problem ist also, wenn ich das Netz mit den Trainingsdaten trainiere und versuche, einige Vorhersagen unter Verwendung der gleichen Trainingsdaten zu machen, stimmen die Ergebnisse nicht ganz überein und sie erscheinen auch seltsam, weil das Aussehen einander gleicht.Grundlegendes neurales Netzwerk in TensorFlow
import tensorflow as tf
import numpy as np
import input_data
sess = tf.InteractiveSession()
# create a 2-D version of input for plotting
trX = np.matrix(([3,5], [5,1],[10,2]), dtype=float)
trY = np.matrix(([85], [82], [93]), dtype=float) # 3X1 matrix
trX = trX/np.max(trX, axis=0)
trY = trY/100 # 100 is the maximum score allowed
teX = np.matrix(([3,5]), dtype=float)
teY = np.matrix(([85]), dtype=float)
teX = teX/np.amax(teX, axis=0)
teY = teY/100
def init_weights(shape):
return tf.Variable(tf.random_normal(shape, stddev=0.01))
def model(X, w_h, w_o):
z2 = tf.matmul(X, w_h)
a2 = tf.nn.sigmoid(z2) # this is a basic mlp, think 2 stacked logistic regressions
z3 = tf.matmul(a2, w_o)
yHat = tf.nn.sigmoid(z3)
return yHat # note that we dont take the softmax at the end because our cost fn does that for us
X = tf.placeholder("float", [None, 2])
Y = tf.placeholder("float", [None, 1])
W1 = init_weights([2, 3]) # create symbolic variables
W2 = init_weights([3, 1])
sess.run(tf.initialize_all_variables())
py_x = model(X, W1, W2)
cost = tf.reduce_mean(tf.square(py_x - Y))
train_op = tf.train.GradientDescentOptimizer(0.5).minimize(cost) # construct an optimizer
predict_op = py_x
sess.run(train_op, feed_dict={X: trX, Y: trY})
print sess.run(predict_op, feed_dict={X: trX})
sess.close()
Es ergibt:
[[0,51873487] [0,51874501] [0,51873082]]
und ich glaube, es sollte auf die Trainingsdaten Ergebnisse ähnlich sein.
Ich bin ziemlich neu in neuronalen Netzen und maschinelles Lernen so entschuldigen Sie mich für irgendwelche Fehler, danke im Voraus.
Vielen Dank für Ihre Antwort, also habe ich den Trainingsschritt in eine Schleife gelegt und viele Kombinationen von Loop-Größen ausprobiert und während die Scores den Trainingsdaten näher kamen, konvergierte es nicht ganz. Selbst wenn ich versuchte, das Modell zu übertreffen, war das Maximum: [[0,85000151] [0,85349745] [0,89352685]] – Thalles
@Thalles, ich bin auch sehr grün darauf, aber ich kann Ihnen sagen, dass es zwei Möglichkeiten gibt Trainieren Sie Ihr nnet: Online- oder stochastisches Lernen, bei dem Backpropagation von jeder einzelnen Beobachtung lernt, und Batch-Lernen, bei dem es von allen gleichzeitig lernt. Es gibt auch Mini-Batch, die eine Mischung aus beidem ist. Stochastik neigt dazu, schneller zu sein, aber Konvergenz geht überall hin. Batch neigt dazu, langsamer zu sein, aber Konvergenz ist stabiler. Weißt du, welches benutzt wird? –
@Thalles Sie werden nie 100% ige Genauigkeit erhalten, aber Ihr Modell könnte viel besser sein, wenn es zum Beispiel Vorurteile enthält. –