Ich portiere mein Caffe-Netzwerk auf TensorFlow, aber es scheint keine Xavier-Initialisierung zu haben. Ich benutze, truncated_normal
aber das scheint es viel schwieriger zu machen, zu trainieren.
python
tensorflow
Alejandro
quelle
quelle
Antworten:
In Tensorflow 2.0 und weiter sind beide
tf.contrib.*
undtf.get_variable()
veraltet. Um die Xavier-Initialisierung durchzuführen, müssen Sie jetzt wechseln zu:Glorot-Uniform und Xavier-Uniform sind zwei verschiedene Namen desselben Initialisierungstyps. Weitere Informationen zur Verwendung von Initialisierungen in TF2.0 mit oder ohne Keras finden Sie in der Dokumentation .
quelle
Seit Version 0.8 gibt es einen Xavier-Initialisierer. Die Dokumentation finden Sie hier .
Sie können so etwas verwenden:
quelle
get_variable
sondern sie dem Initialisierer zu geben? Früher hattetf.truncated_normal(shape=[dims[l-1],dims[l]], mean=mu[l], stddev=std[l], dtype=tf.float64)
ich die Form dort angegeben, aber jetzt schraubt Ihr Vorschlag meinen Code irgendwie durcheinander. Hast du irgendwelche Vorschläge?tf.Variable(...)
und verwendettf.get_variable(...)
Nur um ein weiteres Beispiel zum Definieren einer
tf.Variable
Initialisierung mit der Methode von Xavier und Yoshua hinzuzufügen :Das hat mich daran gehindert
nan
ich aufgrund numerischer Instabilitäten bei Verwendung mehrerer Ebenen mit RELUs Werte für meine Verlustfunktion hatte.quelle
@ Aleph7, Xavier / Glorot-Initialisierung hängt von der Anzahl der eingehenden Verbindungen (fan_in), der Anzahl der ausgehenden Verbindungen (fan_out) und der Art der Aktivierungsfunktion (Sigmoid oder Tanh) des Neurons ab. Siehe hierzu: http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf
Nun zu Ihrer Frage. So würde ich es in TensorFlow machen:
Beachten Sie, dass wir eine Stichprobe aus einer gleichmäßigen Verteilung ziehen sollten und nicht aus der Normalverteilung, wie in der anderen Antwort vorgeschlagen.
Übrigens habe ich gestern mit TensorFlow einen Beitrag für etwas anderes geschrieben, das zufällig auch die Xavier-Initialisierung verwendet. Wenn Sie interessiert sind, gibt es auch ein Python-Notizbuch mit einem End-to-End-Beispiel: https://github.com/delip/blog-stuff/blob/master/tensorflow_ufp.ipynb
quelle
Ein netter Wrapper
tensorflow
namensprettytensor
gibt eine Implementierung im Quellcode (direkt von hier kopiert ):quelle
TF-Contrib hat
xavier_initializer
. Hier ist ein Beispiel für die Verwendung:Darüber hinaus verfügt Tensorflow über weitere Initialisierer:
quelle
Über den
kernel_initializer
Parameter zutf.layers.conv2d, tf.layers.conv2d_transpose, tf.layers.Dense
etc.z.B
https://www.tensorflow.org/api_docs/python/tf/layers/conv2d
https://www.tensorflow.org/api_docs/python/tf/layers/conv2d_transpose
https://www.tensorflow.org/api_docs/python/tf/layers/Dense
quelle
Ich habe nachgesehen und konnte nichts Eingebautes finden. Demnach jedoch:
http://andyljones.tumblr.com/post/110998971763/an-explanation-of-xavier-initialization
Bei der Xavier-Initialisierung wird lediglich eine (normalerweise Gaußsche) Verteilung abgetastet, bei der die Varianz von der Anzahl der Neuronen abhängt.
tf.random_normal
Wenn Sie dies für Sie tun können, müssen Sie nur den Standardwert berechnen (dh die Anzahl der Neuronen, die durch die Gewichtsmatrix dargestellt werden, die Sie initialisieren möchten).quelle
Nur für den Fall, dass Sie eine Zeile verwenden möchten, wie Sie es tun mit:
Du kannst tun:
quelle