78 votes

Quel est l'initialiseur de noyau par défaut dans tf.layers.conv2d et tf.layers.dense?

L'officiel Tensorflow doc API prétend que le paramètre kernel_initializer par défaut à None pour la tf.les couches.conv2d et tf.les couches.dense.

Cependant, en lisant les couches tutoriel (https://www.tensorflow.org/tutorials/layers), j'ai constaté que ce paramètre n'est pas défini dans le code. Par exemple:

# Convolutional Layer #1
conv1 = tf.layers.conv2d(
    inputs=input_layer,
    filters=32,
    kernel_size=[5, 5],
    padding="same",
    activation=tf.nn.relu)

L'exemple de code du tutoriel s'exécute sans erreur, donc je pense que la valeur par défaut kernel_initializer n'est None. Alors, qui d'initialiseur est-il utilisé?

Dans un autre code, je n'ai pas l' kernel_initializer de la conv2d et les couches denses, et que tout allait bien. Cependant, lorsque j'ai tenté de l' kernel_initializer de tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32), j'ai eu NaN erreurs. Ce qui se passe ici? Quelqu'un peut-il aider?

110voto

rmeertens Points 2982

Excellente question! Il est tout à fait un truc pour le savoir!

  • Comme vous pouvez le voir, il n'est pas documenté en tf.layers.conv2d
  • Si vous regardez la définition de la fonction que vous voyez que les appels de fonction variable_scope.get_variable:

Dans le code:

self.kernel = vs.get_variable('kernel',
                                  shape=kernel_shape,
                                  initializer=self.kernel_initializer,
                                  regularizer=self.kernel_regularizer,
                                  trainable=True,
                                  dtype=self.dtype)

Prochaine étape: quelle est l'étendue de la variable à faire lorsque l'initialisation est Aucun?

Ici, il dit:

Si l'initialiseur est - None (par défaut), l'initialisation par défaut dans le passé le constructeur est utilisé. Si celui-ci est None trop, nous utilisons une nouvelle glorot_uniform_initializer.

Donc la réponse est: il utilise l' glorot_uniform_initializer

Pour l'intégralité de la définition de cette initialiseur:

Le Glorot uniforme de l'initialiseur, également appelé Xavier uniforme de l'initialiseur. Il attire des échantillons à partir d'une distribution uniforme dans [-limit, limit] où limit est sqrt(6 / (fan_in + fan_out))fan_in est le nombre d'unités d'entrée dans le poids tenseur et fan_out est le nombre d'unités de sortie dans le poids tenseur. Référence: http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

Edit: c'est ce que j'ai trouvé dans le code et la documentation. Vous pourriez peut-être vérifier que l'initialisation ressemble à ceci en exécutant eval sur le poids!

3voto

xtluo Points 871

Selon ce cours d'Andrew Ng et de la documentation de Xavier , si vous utilisez ReLU comme fonction d'activation, il est préférable de changer l'initialiseur de poids par défaut (qui est l' uniforme de Xavier ) en Xavier normal comme suit:

 y = tf.layers.conv2d(x, kernel_initializer=tf.contrib.layers.xavier_initializer(uniform=False), )
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X