Qu'est-ce que l'initialiseur par défaut du noyau dans tf.couche.conv2d et tf.couche.dense?
L'officiel Tensorflow doc API prétend que le paramètre kernel_initializer par défaut à None pour tf.couche.conv2d et tf.couche.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)
le code d'exemple du tutoriel s'exécute sans aucune erreur, donc je pense que la valeur par défaut kernel_initializer
n'est pas None
. Donc, ce qui initialiseur est utilisé?
dans un autre code, je n'ai pas mis le kernel_initializer
des couches conv2d et denses, et tout allait bien. Cependant, quand j'ai essayé de mettre le kernel_initializer
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?
1 réponses
grande question! Il est tout à fait un truc pour le savoir!
- Comme vous pouvez le voir, il n'est pas documentée dans
tf.layers.conv2d
- Si vous regardez la définition de la fonction vous voyez que la fonction appelle
variable_scope.get_variable
:
EN 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: que fait la variable scope lorsque l'initialiseur N'est pas?
ici il est dit:
Si initialiseur est
None
(la valeur par défaut), l'initialiseur par défaut est passé le constructeur est utilisé. Si celui-ci estNone
aussi, nous utilisons un nouveauglorot_uniform_initializer
.
Donc la réponse est: il utilise le glorot_uniform_initializer
Pour l'intégralité de la définition de cette initialisation:
Le Glorot uniforme de l'initialiseur, également appelé Xavier uniforme de l'initialiseur. Il tire des échantillons d'une distribution uniforme à l'intérieur de [-limite, limite] où
limit
sqrt(6 / (fan_in + fan_out))
oùfan_in
est le nombre d'unités d'entrée dans le poids tenseur 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 le poids!