2015-11-10 4 views

Antwort

86

Seit Version 0.8 gibt es einen Xavier Initialisierer, see here for the docs.

Sie können so etwas wie folgt verwenden:

W = tf.get_variable("W", shape=[784, 256], 
      initializer=tf.contrib.layers.xavier_initializer()) 
+3

Wissen Sie, dies zu tun, ohne 'get_variable' die Form zu geben, sondern stattdessen dem Initialisierer zu geben? Früher hatte ich 'tf.truncated_normal (shape = [dims [l-1], dims [l]], mean = mu [l], stddev = std [l], dtype = tf.float64)' und spezifizierte die Form dort aber, dass jetzt Ihr Vorschlag Art von Schrauben meinen Code nach oben. Hast du irgendwelche Vorschläge? – Pinocchio

+1

@Pinocchio können Sie sich einfach einen Wrapper schreiben, der dieselbe Signatur wie 'tf.Variable (...)' hat und 'tf.get_variable (...)' – jns

+1

"Current" -Link ohne Version: https: // verwendet www.tensorflow.org/api_docs/python/tf/contrib/layers/xavier_initializer – scipilot

3

ich sah, und ich kann an nichts gebaut finde Dies ist jedoch nach.

http://andyljones.tumblr.com/post/110998971763/an-explanation-of-xavier-initialization

Xavier Initialisierung Abtasten nur eine (in der Regel Gaussian) Verteilung, wo die Varianz in Abhängigkeit von der ist Anzahl der Neuronen. tf.random_normal kann das für Sie tun, müssen Sie nur die stddev berechnen (d. H. Die Anzahl der Neuronen, die durch die Gewichtungsmatrix dargestellt werden, die Sie zu initialisieren versuchen).

+0

Vince sollten Sie aus einer einheitlichen Verteilung Stichproben. – Delip

11

@ Aleph7, Xavier/Glorot Initialisierung hängt von der Anzahl der eingehenden Verbindungen (fan_in), Nummer ausgehenden Verbindungen (fan_out), und Art der Aktivierungsfunktion (Sigmoid oder tanh) des Neurons. Siehe hierzu: http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

Also jetzt zu Ihrer Frage. Dies ist, wie ich es in TensorFlow tun würde:

(fan_in, fan_out) = ... 
    low = -4*np.sqrt(6.0/(fan_in + fan_out)) # use 4 for sigmoid, 1 for tanh activation 
    high = 4*np.sqrt(6.0/(fan_in + fan_out)) 
    return tf.Variable(tf.random_uniform(shape, minval=low, maxval=high, dtype=tf.float32)) 

Bitte beachte, dass wir von einer gleichmäßigen Verteilung wurden Probenahme sollten, und nicht die Normalverteilung wie in der anderen Antwort vorgeschlagen.

Übrigens schrieb ich eine post yesterday für etwas anderes mit TensorFlow, das zufällig auch Xavier Initialisierung verwendet. Wenn Sie interessiert sind, gibt es auch einen Python-Notebook mit einem End-to-End-Beispiel: https://github.com/delip/blog-stuff/blob/master/tensorflow_ufp.ipynb

+1

Wie können wir es mit Relust-Aktivierungsfunktion verwenden. – gautam840

+0

Diese Arbeit untersucht das Verhalten von Gewichtsgradienten unter verschiedenen Aktivierungsfunktionen mit der üblicherweise verwendeten Initialisierung. Dann schlagen sie eine universelle Initialisierung unabhängig von irgendeiner Aktivierungsfunktion vor. Außerdem hängt Ihre Methode auch nicht von der Aktivierungsfunktion ab, daher ist es besser, die integrierte Xavier-Initialisierung in Tensorflow zu verwenden. –

6

Ein schöner Wrapper um tensorflow genannt prettytensor eine Implementierung in der Quellcode gibt (kopiert direkt von here):

def xavier_init(n_inputs, n_outputs, uniform=True): 
    """Set the parameter initialization using the method described. 
    This method is designed to keep the scale of the gradients roughly the same 
    in all layers. 
    Xavier Glorot and Yoshua Bengio (2010): 
      Understanding the difficulty of training deep feedforward neural 
      networks. International conference on artificial intelligence and 
      statistics. 
    Args: 
    n_inputs: The number of input nodes into each output. 
    n_outputs: The number of output nodes for each input. 
    uniform: If true use a uniform distribution, otherwise use a normal. 
    Returns: 
    An initializer. 
    """ 
    if uniform: 
    # 6 was used in the paper. 
    init_range = math.sqrt(6.0/(n_inputs + n_outputs)) 
    return tf.random_uniform_initializer(-init_range, init_range) 
    else: 
    # 3 gives us approximately the same limits as above since this repicks 
    # values greater than 2 standard deviations from the mean. 
    stddev = math.sqrt(3.0/(n_inputs + n_outputs)) 
    return tf.truncated_normal_initializer(stddev=stddev) 
4

TF-contrib hat xavier_initializer.Hier ist ein Beispiel wie man es benutzt:

import tensorflow as tf 
a = tf.get_variable("a", shape=[4, 4], initializer=tf.contrib.layers.xavier_initializer()) 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    print sess.run(a) 

Zusätzlich dazu, tensorflow hat andere Initialisierungen:

+0

Danke, Sir, das war sehr hilfreich, ich möchte Sie fragen, ob ich die ** Bias ** mit ** Xavier_initializer ** –

14

nur ein weiteres Beispiel hinzuzufügen, wie ein tf.Variable initialisiert unter Verwendung Xavier and Yoshua ‚s Methode zu definieren:

Das hat mich davon abgehalten, nan Werte auf meine Verlustfunktion wegen numerischer Instabilitäten zu haben, wenn Sie mehrere Schichten mit RELUs verwenden.

+2

Dieses Format initialisieren kann passte meinen Code am besten an - und es erlaubte mir, meine Lernrate auf 0,5 zurückzusetzen (ich musste sie auf 0,06 senken, wenn ich eine weitere Relued-Schicht hinzufügte). Nachdem ich diesen Initialisierer auf ALLE versteckten Ebenen angewendet hatte, erhielt ich unglaublich hohe Validierungsraten bereits in den ersten paar hundert Epochen. Ich kann den Unterschied nicht glauben! – scipilot