2017-03-15 1 views
1

Ich versuche, eine binäre Ausgabe mit Tensorflow vorherzusagen. Die Trainingsdaten haben ungefähr 69% Nullen für die Ausgabe. Die Eingabemerkmale sind reellwertig, und ich normalisierte sie, indem ich den Mittelwert subtrahiere und durch die Standardabweichung dividiere. Jedes Mal, wenn ich das Netzwerk betreibe, kann ich, egal, welche Techniken ich ausprobiert habe, kein Modell> 69% genau erhalten, und es sieht so aus, als würde mein Yhat nur auf Nullen konvergieren.Tensorflow konvergieren zu bedeuten

Ich habe eine Menge Dinge wie verschiedene Optimierer, Verlustfunktionen, Losgrößen usw. ausprobiert. Aber egal, was ich tue, es konvergiert zu 69% und geht nie über. Ich schätze, es gibt ein größeres Problem mit dem, was ich tue, aber ich kann es nicht finden.

Hier ist die neueste Version von meinem Code

X = tf.placeholder(tf.float32,shape=[None,14],name='X') 
    Y = tf.placeholder(tf.float32,shape=[None,1],name='Y') 

    W1 = tf.Variable(tf.truncated_normal(shape=[14,20],stddev=0.5)) 
    b1 = tf.Variable(tf.zeros([20])) 
    l1 = tf.nn.relu(tf.matmul(X,W1) + b1) 

    l1 = tf.nn.dropout(l1,0.5) 

    W2 = tf.Variable(tf.truncated_normal(shape=[20,20],stddev=0.5)) 
    b2 = tf.Variable(tf.zeros([20])) 
    l2 = tf.nn.relu(tf.matmul(l1,W2) + b2) 

    l2 = tf.nn.dropout(l2,0.5) 

    W3 = tf.Variable(tf.truncated_normal(shape=[20,15],stddev=0.5)) 
    b3 = tf.Variable(tf.zeros([15])) 
    l3 = tf.nn.relu(tf.matmul(l2,W3) + b3) 

    l3 = tf.nn.dropout(l3,0.5) 

    W5 = tf.Variable(tf.truncated_normal(shape=[15,1],stddev=0.5)) 
    b5 = tf.Variable(tf.zeros([1])) 
    Yhat = tf.matmul(l3,W5) + b5 

    loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Yhat, labels=Y)) 

    learning_rate = 0.005 
    l2_weight = 0.001 
    learner = tf.train.AdamOptimizer(learning_rate).minimize(loss) 

    correct_prediction = tf.equal(tf.greater(Y,0.5), tf.greater(Yhat,0.5)) 
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

Antwort

0

Sie sind eine konstante Dropout verwenden.

l3 = tf.nn.dropout(l3,0.5) 

Dropout sollte nur während des Trainings und nicht während der Überprüfung der Genauigkeit oder während der Vorhersage verwendet werden.

keep_prob = tf.placeholder(tf.float32) 
l3 = tf.nn.dropout(l3,keep_prob) 

Der Platzhalter sollte während des Trainings und 1 während des Tests/der Vorhersage einen angemessenen Wert erhalten.

Sie haben Aussetzer in jeder Schicht, ich bin nicht sicher, ob Sie so viele Aussetzer für ein kleines Netzwerk benötigen. Hope this

+0

Danke für den Rat. Es hat das Problem nicht gelöst, aber ich bin mir sicher, dass es mir helfen wird, sobald ich diesen Absturz überwunden habe. – Iinferno1

0

hilft Wenn Sie berechnen Sie Ihre correct_prediction

correct_prediction = tf.equal(tf.greater(Y,0.5), tf.greater(Yhat,0.5)) 

Es scheint, dass Yhat noch ist Logits, Sie sollen eine Y_pred mit Sigmoid berechnen, und verwenden Sie die Y_pred Ihre correct_prediction

Y_pred = tf.nn.sigmoid(Yhat) 
    correct_prediction = tf.equal(tf.greater(Y,0.5), tf.greater(Y_pred,0.5)) 
berechnen
Verwandte Themen