2016-11-10 7 views
0

Ich versuche Tensorflow zu lernen und versuche derzeit, eine einfache logistische Regressionsmodell zu tun. Hier ist mein Code, den ich aus verschiedenen Beispielen zusammengesetzt habe, die ich finden konnte.logistische Regression Debug Tensorflow

with tf.Session() as sess: 
    # Training data 
    input = tf.constant(tra) 
    target = tf.constant(np.transpose(data[:,1]).astype(np.float64)) 

    # Set model weights 
    W = tf.Variable(np.random.randn(10, 1).astype(np.float64)) 

    # Construct model 
    mat=tf.matmul(input,W) 
    pred = tf.sigmoid(mat) 

    # Compute the error 
    yerror = tf.sub(pred, target) 
    # We are going to minimize the L2 loss. The L2 loss is the sum of the 
    # squared error for all our estimates of y. This penalizes large errors 
    # a lot, but small errors only a little. 
    loss = tf.nn.l2_loss(yerror) 

    # Gradient Descent 
    update_weights = tf.train.GradientDescentOptimizer(0.05).minimize(loss) 

    # Initializing the variables 
    tf.initialize_all_variables().run() 

    for _ in range(50): 
     # Repeatedly run the operations, updating the TensorFlow variable. 
     sess.run(update_weights) 

     print(loss.eval()) 

so dass der Code läuft, aber die Fehler Dosis verbessert nicht nach jedem ‚sess.run (update_weights)‘ itteration und ich habe versucht, mit diffrent Schrittgrößen.

Ich frage mich, ob das Setup korrekt ist?

Ich bin ein bisschen unsicher, wie man es debuggen kann, da die Berechnung von allem beim Laufbefehl erfolgt. Die Trainingsdaten sind in Ordnung. Wenn einige von euch sehen könnten, was ich falsch mache, in dieser ganzen Session aufbauen oder Vorschläge machen, wie ich das debuggen kann.

Hilfe sehr geschätzt.

Antwort

0

Okay, also habe ich ein paar Tests durchgeführt und festgestellt, dass es Probleme mit den Dimensionen der Zielvariable hatte. Ich musste spezifi, dass es AMX 1-Matrix (wobei m die Anzahl der traning Beispiele) diese mit Angabe der Form auf die konstante Variable erfolgt:

target = tf.constant(np.transpose(data[:,1]).astype(np.float64), shape=[m,1]) 

auch die gradiant anständig tun nicht so gut, bis ich normalisierte die Merkmale.

0

Während das, was Sie tun, eine vernünftige Sache für die Regression ist, wird dies wahrscheinlich nicht gut in einer Klassifizierungsaufgabe funktionieren. Dies ist auch nicht typisch für eine logistische Regression. Für die logistische Regression maximieren Sie die über alle Daten summierte Summe log prob(correct label|input). Dies geschieht bequemerweise durch eine Softmax-Schicht.

Es gibt nützliche mathematische Eigenschaften, die dazu beitragen, das Debuggen zu erleichtern. Zum Beispiel, wenn Sie Eingabe ist völlig zufällig, dann sollte der Verlust log (N) sein. Wenn Sie alle Gewichte auf Null setzen, sollte das der Verlust sein. Wenn Sie Proben beschriften, sagen 1/3 positiv, und 2/3 negativ in einer binären Klassifizierung, dann sollte ein Modell, das keine Eingabe berücksichtigt (nur eine Verzerrung Begriff) nur log(2/3) zurückgeben, so dass Sie debuggen können, was Sie zu einigen bekommen Umfang.

+0

Dank für einen Kommentar einiger Fragen: Kann ich irgendwelche Zufallszahl setzen oder sollte es zufällig Gauß- mit Mittelwert 0 und std 1 sein? und sind die N in log (N) die Anzahl der Features, die ich habe oder die Anzahl der Trainingsbeispiele? –

+0

Wenn die Gewichte alle Null sind, ist es nicht wirklich wichtig, was die Gewichte sind, aber ansonsten ja, Sie können alles füttern, das nicht mit der Ausgabe korreliert ist. Das "N" bezieht sich auf die Anzahl der Klassen. – drpng

Verwandte Themen