Das offizielle Tensorflow API-Dokument behauptet, dass der Parameter kernel_initializer
standardmäßig None
für tf.layers.conv2d
und verwendet wird tf.layers.dense
.
Beim Lesen des Layer-Tutorials ( https://www.tensorflow.org/tutorials/layers ) habe ich jedoch festgestellt, dass dieser Parameter nicht im Code festgelegt ist. Zum Beispiel:
# Convolutional Layer #1
conv1 = tf.layers.conv2d(
inputs=input_layer,
filters=32,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
Der Beispielcode aus dem Tutorial läuft fehlerfrei, daher ist der Standardcode meiner Meinung nach kernel_initializer
nicht None
. Welcher Initialisierer wird also verwendet?
In einem anderen Code habe ich kernel_initializer
die Conv2d- und die dichten Ebenen nicht festgelegt , und alles war in Ordnung. Als ich jedoch versuchte, das kernel_initializer
auf zu setzen tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32)
, bekam ich NaN-Fehler. Was geht hier vor sich? Kann jemand helfen?
quelle
Antworten:
Gute Frage! Es ist ein ziemlicher Trick, es herauszufinden!
tf.layers.conv2d
variable_scope.get_variable
:In Code:
self.kernel = vs.get_variable('kernel', shape=kernel_shape, initializer=self.kernel_initializer, regularizer=self.kernel_regularizer, trainable=True, dtype=self.dtype)
Nächster Schritt: Was macht der Variablenbereich, wenn der Initialisierer None ist?
Hier steht:
Die Antwort lautet also: Es wird das verwendet
glorot_uniform_initializer
Der Vollständigkeit halber die Definition dieses Initialisierers:
Bearbeiten: Das habe ich im Code und in der Dokumentation gefunden. Vielleicht können Sie überprüfen, ob die Initialisierung so aussieht, indem Sie die Gewichte bewerten!
quelle
Laut diesem Kurs von Andrew Ng und der Xavier-Dokumentation sollten Sie, wenn Sie ReLU als Aktivierungsfunktion verwenden, den Standardgewichtungsinitialisierer (der Xavier-Uniform ist ) besser in Xavier normal ändern, indem Sie:
y = tf.layers.conv2d(x, kernel_initializer=tf.contrib.layers.xavier_initializer(uniform=False), )
quelle
keras.initializers.glorot_normal(seed=None)
oder einfachkernel_initializer= 'glorot_normal'
drinnenConv2D
in Keras.2.0 kompatible Antwort : Auch in Tensorflow 2.0, der Standard
Kernel Initializer
intf.keras.layers.Conv2D
undtf.keras.layers.Dense
istglorot_uniform
.Dies ist auf der Tensorflow.org-Website angegeben.
Der Link für
Conv2D
lautet https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv2D?version=nightly# initund der Link für
Dense
isthttps://www.tensorflow.org/api_docs/python/tf/keras/layers/Dense?version=nightly# init
quelle