2015-12-15 13 views
8

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.

Antwort

9

Der Hauptgrund dafür, dass Ihr Netzwerk ist, dass die Aussage nicht Ausbildung:

sess.run(train_op, feed_dict={X: trX, Y: trY}) 

... führt nur einmal. In TensorFlow, läuft train_op (oder was auch immer Betrieb von Optimizer.minimize() zurückgegeben wird nur das Netzwerk verursacht einen einzelnen Gradientenabfallsaktualisierung Schritt. Sie es in einer Schleife ausgeführt werden sollen iteratives Training durchführen, und die Gewichte werden schließlich zusammenlaufen.

Zwei andere Tipps: (i) Sie könnten eine schnellere Konvergenz erreichen, wenn Sie eine Untermenge Ihrer Trainingsdaten in jedem Schritt anstatt des gesamten Datensatzes füttern und (ii) die Lernrate von 0,5 wahrscheinlich zu hoch ist (obwohl dies von die Daten)

+0

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

+0

@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? –

+0

@Thalles Sie werden nie 100% ige Genauigkeit erhalten, aber Ihr Modell könnte viel besser sein, wenn es zum Beispiel Vorurteile enthält. –

Verwandte Themen