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

La documentation officielle de l’API Tensorflow affirme que le paramètre kernel_initializer est défini par défaut sur None pour tf.layers.conv2d et tf.layers.dense.

Cependant, en lisant le didacticiel des couches ( https://www.tensorflow.org/tutorials/layers ), j’ai noté 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 didacticiel s’exécute sans erreur, donc je pense que l’ kernel_initializer par défaut n’est pas None . Alors, quel initialiseur est utilisé?

Dans un autre code, je n’ai pas défini le kernel_initializer des couches conv2d et dense, et tout allait bien. Cependant, lorsque j’ai essayé de définir kernel_initializer sur tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32) , j’ai eu des erreurs NaN. Qu’est-ce qui se passe ici? Quelqu’un peut-il aider?

Bonne question! C’est un truc pour le savoir!

  • Comme vous pouvez le voir, ce n’est pas documenté dans tf.layers.conv2d
  • Si vous regardez la définition de la fonction, vous voyez que la fonction appelle variable_scope.get_variable :

Dans du code:

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

Etape suivante: que fait la scope de la variable lorsque l’initialiseur est Aucun?

Ici il est dit:

Si l’initialiseur est None (valeur par défaut), l’initialiseur par défaut transmis dans le constructeur est utilisé. Si celui-ci l’est également, nous utilisons un nouvel glorot_uniform_initializer .

Donc, la réponse est: il utilise le glorot_uniform_initializer

Pour compléter la définition de cet initialiseur:

L’initialiseur uniforme Glorot, également appelé l’initialiseur uniforme Xavier. Il dessine des échantillons d’une dissortingbution 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 tenseur de poids 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 les poids!