Wie in 2-Ebenen neuronales Netz mit TensorFlow und python auf dem MNIST-Daten
Ich bin ein Neuling in der Maschine zu lernen, und ich bin nach tensorflow tutorial zu erstellen einige einfache Neuronale Netze, die lernen, die MNIST-Daten.
Ich gebaut haben eine single-layer-Netzwerk (nach dem tutotial), Genauigkeit war über 0.92, das ist ok für mich. Aber dann fügte ich eine weitere Ebene, die Genauigkeit reduziert, 0.113, das ist sehr schlecht.
Unten ist die Beziehung zwischen 2 Schichten:
import tensorflow as tf
x = tf.placeholder(tf.float32, [None, 784])
#layer 1
W1 = tf.Variable(tf.zeros([784, 100]))
b1 = tf.Variable(tf.zeros([100]))
y1 = tf.nn.softmax(tf.matmul(x, W1) + b1)
#layer 2
W2 = tf.Variable(tf.zeros([100, 10]))
b2 = tf.Variable(tf.zeros([10]))
y2 = tf.nn.softmax(tf.matmul(y1, W2) + b2)
#output
y = y2
y_ = tf.placeholder(tf.float32, [None, 10])
Ist meine Struktur in Ordnung? Was ist der Grund dafür, dass macht es so schlecht? Wie sollte ich ändern mein Netzwerk?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Eingabe der 2. Schicht ist die
softmax
von der Ausgabe der ersten Schicht. Sie wollen nicht, das zu tun.Sind Sie zu zwingen aus der Summe dieser Werte werden 1. Wenn einige Wert
tf.matmul(x, W1) + b1
ist, die 0 (und einige sind sicherlich) die softmax-Betrieb sinkt dieser Wert auf 0 ein. Ergebnis: du bist die Tötung der gradient und es kann nichts fließen Trog diese Neuronen.Wenn Sie entfernen die softmax zwischen den Schichten (aber leve es die softmax auf der output-Ebene, wenn Sie wollen, betrachten die Werte als Wahrscheinlichkeit) Ihr Netzwerk funktioniert Prima.
Tl;dr:
Kam in genau dem gleichen problem, die Steigungen gingen und bekam ein paar
nan
für die vorhergesagteny
. Umgesetzt, was vorgeschlagen von nessuno, leider, die divergierenden Verläufe noch nicht fest.Stattdessen hab ich versucht
sigmoid
wie die Aktivierung der Funktion für layer 1, es funktionierte! Aber fürrelu
funktionierte nicht, wenn initiierenW1
undW2
als null-Matrizen, die Genauigkeit ist nur 0.1135 . Um beiderelu
undsigmoid
arbeiten, besser in zufälliger Initialisierung derW1
undW2
. Hier ist der geänderte codeFand ich dieser link ist hilfreich, siehe Frage 2, Teil (c), die RÜCKFÜHRUNG von Derivaten, die für eine grundlegende 2-layer neural network. Meiner Meinung nach, wenn der Benutzer nicht geben Sie alle acivation-Funktion, nur für lineare Strömung in der Ebene 1, wird am Ende mit backprograting einen Verlauf sieht etwas wie
(sth)*W2^T*W1^T
, und als wir initilize beideW1
undW2
zu Nullen, Ihr Produkt ist wahrscheinlich sehr klein, nahe null, das Ergebnis in verschwindenden Gradienten.UPDATE
Dies ist von den Quora-Antwort Ofir gepostet über erste gute GEWICHTE in einem neuronalen Netzwerk.
Ich versuchte, die code-snippets oben. Ergebnisse unter 90% wurde verworfen und ich nie wirklich das Gefühl, sicher, dass ich Tat, was die Kommentare oben hatte. Hier ist mein vollständiger code.
Durch die änderung 10000 -> 200000 ich erreichte 95,5%.
W = tf.Variable(tf.random_uniform([784,100], -0.01, 0.01))
. Klingt nicht nach viel, aber die Initialisierung der GEWICHTE nahe 0 tatsächlich hilft in diesem Fall.