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!
tf.layers.conv2d
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 nouvelglorot_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
estsqrt(6 / (fan_in + fan_out))
oùfan_in
est le nombre d’unités d’entrée dans le tenseur de poids etfan_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!