Nuestros mejores programadores agotaron sus depósitos de café, investigando noche y día por la solución, hasta que Isabel halló el hallazgo en Bitbucket por lo tanto hoy la compartimos aquí.
Solución:
Dado que la versión 0.8 hay un inicializador de Xavier, consulte aquí los documentos.
Puedes usar algo como esto:
W = tf.get_variable("W", shape=[784, 256],
initializer=tf.contrib.layers.xavier_initializer())
Solo para agregar otro ejemplo sobre cómo definir un tf.Variable
inicializado usando el método de Xavier y Yoshua:
graph = tf.Graph()
with graph.as_default():
...
initializer = tf.contrib.layers.xavier_initializer()
w1 = tf.Variable(initializer(w1_shape))
b1 = tf.Variable(initializer(b1_shape))
...
Esto me impidió tener nan
valores en mi función de pérdida debido a inestabilidades numéricas cuando uso múltiples capas con RELU.
@ Aleph7, la inicialización de Xavier / Glorot depende del número de conexiones entrantes (fan_in), el número de conexiones salientes (fan_out) y el tipo de función de activación (sigmoidea o tanh) de la neurona. Vea esto: http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf
Así que ahora, a tu pregunta. Así es como lo haría en TensorFlow:
(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))
Tenga en cuenta que deberíamos tomar muestras de una distribución uniforme y no de la distribución normal como se sugiere en la otra respuesta.
Por cierto, ayer escribí una publicación para algo diferente usando TensorFlow que también usa la inicialización de Xavier. Si está interesado, también hay un cuaderno de Python con un ejemplo de extremo a extremo: https://github.com/delip/blog-stuff/blob/master/tensorflow_ufp.ipynb
valoraciones y comentarios
Si te gustó nuestro trabajo, tienes la habilidad dejar un ensayo acerca de qué le añadirías a esta división.