in genau kam das gleiche Problem, Steigungen abwich und bekam eine Reihe von nan
für die vorhergesagte y
. Implementiert, was von Nessuno vorgeschlagen wurde, leider sind die divergierenden Gradienten noch nicht behoben.
Stattdessen habe ich versucht sigmoid
als Aktivierungsfunktion für Schicht 1, es hat funktioniert! Aber für relu
nicht funktioniert, wenn W1
und als Nullmatrizen initiieren, ist die Genauigkeit nur 0,11135. Um sowohl relu
als auch sigmoid
arbeiten zu lassen, sollte die Initialisierung von W1
und W2
besser randomisiert werden. Hier ist der modifizierte Code
import tensorflow as tf
x = tf.placeholder(tf.float32, [None, 784])
# layer 1
with tf.variable_scope('layer1'):
W1 = tf.get_variable('w1',[784,200],
initializer=tf.random_normal_initializer())
b1 = tf.get_variable('b1',[1,],
initializer=tf.constant_initializer(0.0))
y1 = tf.nn.sigmoid(tf.matmul(x, W1) + b1)
# y1 = tf.nn.relu(tf.matmul(x, W1) + b1) # alternative choice for activation
# layer 2
with tf.variable_scope('layer2'):
W2 = tf.get_variable('w2',[200,10],
initializer= tf.random_normal_nitializer())
b2 = tf.get_variable('b2',[1,],
initializer=tf.constant_initializer(0.0))
y2 = tf.nn.softmax(tf.matmul(y1, W2) + b2)
# output
y = y2
y_ = tf.placeholder(tf.float32, [None, 10])
Ich fand this link nützlich ist, siehe Frage 2 Teil (c), das Backpropagation-Derivate für ein grundlegendes 2-Schicht neuronale Netz gibt. Meiner Meinung nach, wenn Benutzer keine Aktivierungsfunktion angegeben haben, wenden Sie einfach linearen Fluss in Schicht 1 an, wird am Ende mit der Rückprogression eines Farbverlaufs etwas wie (sth)*W2^T*W1^T
, und wie wir W1
und W2
als Nullen initiieren, ist ihr Produkt wahrscheinlich sehr nahe Null zu sein, was zu verschwindenden Gradienten führt.
UPDATE
Das von der Quoren Antwort ist Ofir posted über eine gute Anfangsgewichte in einem neuronalen Netzwerk.
Die häufigsten Initialisierungen sind zufällige Initialisierung und Xavier Initialisierung. Die zufällige Initialisierung tastet nur jedes Gewicht von einer Standardverteilung ab (oft eine normale Verteilung) mit einer niedrigen Abweichung.Die geringe Abweichung können Sie Voreingenommenheit das Netzwerk in Richtung die ‚einfache‘ 0 Lösung, ohne die schlechten Auswirkungen der tatsächlich Initialisierung der Gewichte auf 0.
Danke @nessuno, Sie haben Recht! Jetzt ersetze ich es durch ReLU und es funktioniert sehr gut ^^ –