python find - Comment faire pour initialiser Xavier sur TensorFlow




2.7 requirement (8)

Via le paramètre kernel_initializer à tf.layers.conv2d, tf.layers.conv2d_transpose, tf.layers.Dense etc

par exemple

layer = tf.layers.conv2d(
     input, 128, 5, strides=2,padding='SAME',
     kernel_initializer=tf.contrib.layers.xavier_initializer())

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

Je transfère mon réseau Caffe à TensorFlow mais il ne semble pas avoir d'initialisation xavier. J'utilise truncated_normal mais cela semble rendre l'entraînement beaucoup plus difficile.


Juste pour ajouter un autre exemple sur la façon de définir un tf.Variable initialisé en utilisant la méthode de Xavier et 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))
    ...

Cela m'a empêché d'avoir des valeurs nan sur ma fonction de perte en raison des instabilités numériques lors de l'utilisation de plusieurs couches avec des RELU.


@ Aleph7, l'initialisation de Xavier / Glorot dépend du nombre de connexions entrantes (fan_in), du nombre de connexions sortantes (fan_out) et du type de fonction d'activation (sigmoïde ou tanh) du neurone. Voir ceci: http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

Alors maintenant, à votre question. Voici comment je le ferais dans 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))

Notez que nous devrions échantillonner à partir d'une distribution uniforme, et non de la distribution normale comme suggéré dans l'autre réponse.

Incidemment, j'ai écrit un post hier pour quelque chose de différent en utilisant TensorFlow qui utilise aussi l'initialisation de Xavier. Si vous êtes intéressé, il y a aussi un cahier python avec un exemple de bout en bout: https://github.com/delip/blog-stuff/blob/master/tensorflow_ufp.ipynb


Juste au cas où vous voulez utiliser une ligne comme vous le faites avec:

W = tf.Variable(tf.truncated_normal((n_prev, n), stddev=0.1))

Tu peux faire:

W = tf.Variable(tf.contrib.layers.xavier_initializer()((n_prev, n)))

J'ai regardé et je n'ai rien pu trouver. Cependant, d'après ceci:

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

L'initialisation de Xavier consiste simplement à échantillonner une distribution (généralement gaussienne) où la variance est fonction du nombre de neurones. tf.random_normal peut le faire pour vous, il vous suffit de calculer le stddev (ie le nombre de neurones représentés par la matrice de poids que vous essayez d'initialiser).


Un joli wrapper autour de tensorflow appelé prettytensor donne une implémentation dans le code source (copié directement à partir d' 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)

Depuis la version 0.8 il y a un initialiseur de Xavier, voir ici pour les docs .

Vous pouvez utiliser quelque chose comme ceci:

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

Il n’est pas possible de trier un dictionnaire, mais uniquement d’obtenir une représentation d’un dictionnaire trié. Les dictionnaires sont intrinsèquement sans ordre, mais d'autres types, tels que les listes et les n-uplets, ne le sont pas. Vous avez donc besoin d'un type de données ordonné pour représenter les valeurs triées, qui sera une liste - probablement une liste de n-uplets.

Par exemple,

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1))

sorted_x sera une liste de tuples triés par le deuxième élément de chaque tuple. dict(sorted_x) == x .

Et pour ceux qui souhaitent trier les clés au lieu des valeurs:

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(0))

En Python3 car le décompactage n’est pas autorisé [1] nous pouvons utiliser

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_by_value = sorted(x.items(), key=lambda kv: kv[1])






python tensorflow