2017-08-18 3 views
1

Ich versuche, die Titanic Kaggle-Wettbewerb mit Tensorflow versuchen.Verlust ist gleich 0 von Anfang an

sieht My vorverarbeitet Zugdaten wie folgt aus:

data_x: 

PassengerId Pclass Sex Age SibSp Parch Ticket Fare Cabin \ Embarked 
1    2  1 1 38.0  1  0  500 71.2833 104 
2    3  3 1 26.0  0  0  334 7.9250  0 
3    4  1 1 35.0  1  0  650 53.1000 130 
4    5  3 0 35.0  0  0  638 8.0500  0 

data_y: 

Survived 
0 
1 
1 
1 
0 

A softmax Funktion sollte die Arbeit vorhersagen, ob ein Passagier überlebt oder nicht, da es binär, richtig machen?

Also hier ist, wie ich mein Modell zu bauen:

X = tf.placeholder(tf.float32, [None, data_x.shape[1]]) 
Y_ = tf.placeholder(tf.float32, [None, 1]) 

W = tf.Variable(tf.truncated_normal([10, 1])) 
b = tf.Variable(tf.zeros([1])) 

# Parameters 
learning_rate = 0.001 

#The model 
Y = tf.matmul(X,W) + b 

# Loss function 
entropy = tf.nn.softmax_cross_entropy_with_logits(labels=Y_, logits=Y) 
loss = tf.reduce_mean(entropy) # computes the mean over examples in the batch 

optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss) 

acc = tf.equal(tf.argmax(Y_, 1), tf.argmax(Y, 1)) 
acc = tf.reduce_mean(tf.cast(acc, tf.float32)) 

tf.summary.scalar('loss', loss) 
tf.summary.scalar('accuracy', acc) 
merged_summary = tf.summary.merge_all() 

init = tf.global_variables_initializer() 

Und finallyn, die Ausbildung Teil:

with tf.Session() as sess: 
    sess.run(init) 
    writer = tf.summary.FileWriter("./graphs", sess.graph) 
    for i in range(1000): 
     _, l, summary = sess.run([optimizer, loss, merged_summary], feed_dict={X: data_x, Y_: data_y}) 
     writer.add_summary(summary, i) 
     if i%100 == 0: 
      print (i) 
      print ("loss = ", l) 

Aber Verlust ist gleich 0, da der erste Schritt ...

Hier ist Tensorboard Visualisierung:

enter image description here

Irgendeine Idee, was hier vor sich geht?

Antwort

0

Verwenden

entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=Y_, logits=Y) 

statt

entropy = tf.nn.softmax_cross_entropy_with_logits(labels=Y_, logits=Y) 
+0

Danke für Ihre Antwort. Kannst du den Unterschied zwischen diesen beiden erklären? –

+0

Sie können Erklärung in der Antwort für diese Frage finden: https://stackoverflow.com/questions/37312421/tensorflow-whats-the-difference-between-sparse-softmax-cross-entropy-with-logi –

2

Eigentlich, denke ich Sie auf die Idee von softmax falsch. Es transformiert Ausgaben so, dass sie eine Wahrscheinlichkeitsverteilung sind. Da Ihre Ausgabe jedoch nur ein Neuron ist, transformiert softmax sie immer in 1.

Wenn Sie wollen, dass softmax + Entropie mit logits kreuzt, müssen Sie 2 Neuronen ausgeben, eine für Wahrscheinlichkeit der Vorhersage ist 1 (positiv), eine für die Wahrscheinlichkeit, dass sie 0 ist (negativ). Auch müssen Sie Etiketten ändern, so dass positives Beispiel hat Label [1, 0], negative [0, 1]. Dann können Sie Cross Entropy verwenden und es sollte funktionieren.

EDIT: Eine andere gute Option könnte sein, tf.nn.sigmoid_cross_entropy_with_logits Verlustfunktion zu verwenden. Sigmoid führt die Umwandlung in das [0, 1] Intervall durch, das Sie für die Kreuz-Entropie benötigen, und macht sich keine Gedanken über (mögliche) andere Ausgaben. Auf diese Weise würde es mit Ihren aktuellen Etiketten und Ihrer Architektur funktionieren.

+0

natürlich! Ich habe es vergessen ... Es muss ein heißes verschlüsselt sein. Ich werde es versuchen und dich wissen lassen :) –