2017-08-05 4 views
0

Ich habe einen einfachen binären Klassifikator mit TensorFlow geschrieben. Aber das einzige Ergebnis, das ich für die optimierten Variablen erhalte, ist NaN. Hier ist der Code:Kann nicht einfach binären Klassifikator zu arbeiten

import tensorflow as tf 

# Input values 
x = tf.range(0., 40.) 
y = tf.constant([0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 
       1., 0., 0., 1., 0., 1., 0., 1., 1., 1., 
       1., 1., 0., 1., 1., 1., 0., 1., 1., 1., 
       1., 1., 1., 0., 1., 1., 1., 1., 1., 1.]) 

# Variables 
m = tf.Variable(tf.random_normal([])) 
b = tf.Variable(tf.random_normal([])) 

# Model and cost 
model = tf.nn.sigmoid(tf.add(tf.multiply(x, m), b)) 
cost = -1. * tf.reduce_sum(y * tf.log(model) + (1. - y) * (1. - tf.log(model))) 

# Optimizer 
learn_rate = 0.05 
num_epochs = 20000 
optimizer = tf.train.GradientDescentOptimizer(learn_rate).minimize(cost) 

# Initialize variables 
init = tf.global_variables_initializer() 

# Launch session 
with tf.Session() as sess: 
    sess.run(init) 

    # Fit all training data 
    for epoch in range(num_epochs): 
     sess.run(optimizer) 

    # Display results 
    print("m =", sess.run(m)) 
    print("b =", sess.run(b)) 

Ich habe verschiedene Optimierer, Lernraten und Testgrößen ausprobiert. Aber nichts scheint zu funktionieren. Irgendwelche Ideen?

+0

Anzahl der Epochen sieht viel zu groß aus. Sie sollten stattdessen 100 oder etwas versuchen. – tagoma

+0

versuchen Sie 'reduce_mean' anstatt' reduce_sum' an dieser Zeile 'cost = -1. * tf.reduce_sum (y * tf.log (model) + (1. - y) * (1. - tf.log (model))) ' –

+0

Die Änderung von' reduce_sum' zu 'reduce_mean' hat nicht geholfen, aber reduziert die Anzahl der Epochen tat es. Bizarr. Danke, Edouard! Wenn du deinen Kommentar als Antwort postest, werde ich ihn als Antwort markieren. – user934904

Antwort

1

Sie initialisieren m und b mit Standardabweichung 1, aber in Bezug auf Ihre Daten x und y, können Sie m erwarten deutlich kleiner als 1. Sie b auf Null initialisiert werden kann (dies ist für Vorspannungsterme sehr beliebt ist) und m mit einer viel kleineren Standardabweichung (zum Beispiel 0,0005) und reduzieren Sie die Lernrate gleichzeitig (zum Beispiel auf 0,00000005). Sie können die NaN-Werte verzögern, wenn Sie diese Werte ändern, aber sie werden wahrscheinlich irgendwann auftreten, da Ihre Daten von einer linearen Funktion meiner Meinung nach nicht gut beschrieben werden.

import tensorflow as tf 
import matplotlib.pyplot as plt 

# Input values 
x = tf.range(0., 40.) 
y = tf.constant([0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 
        1., 0., 0., 1., 0., 1., 0., 1., 1., 1., 
             1., 1., 0., 1., 1., 1., 0., 1., 1., 1., 
                 1., 1., 1., 0., 1., 1., 
                 1., 1., 1., 1.]) 

# Variables 
m = tf.Variable(tf.random_normal([], mean=0.0, stddev=0.0005)) 
b = tf.Variable(tf.zeros([])) 

# Model and cost 
model = tf.nn.sigmoid(tf.add(tf.multiply(x, m), b)) 
cost = -1. * tf.reduce_sum(y * tf.log(model) + (1. - y) * (1. - tf.log(model))) 

# Optimizer 
learn_rate = 0.00000005 
num_epochs = 20000 
optimizer = tf.train.GradientDescentOptimizer(learn_rate).minimize(cost) 

# Initialize variables 
init = tf.global_variables_initializer() 

# Launch session 
with tf.Session() as sess: 
    sess.run(init) 

    # Fit all training data 
    for epoch in range(num_epochs): 
     _, xs, ys = sess.run([optimizer, x, y]) 

    ms = sess.run(m) 
    bs = sess.run(b) 
    print(ms, bs) 
plt.plot(xs,ys) 
plt.plot(xs, ms * xs + bs) 
plt.savefig('tf_test.png') 
plt.show() 
plt.clf() 
Verwandte Themen