Resmi Tensorflow API doc mengklaim bahwa parameter kernel_initializer
default Tidak
untuk tf.lapisan-lapisan.conv2d
dan tf.lapisan-lapisan.padat
.
Namun, membaca lapisan tutorial (https://www.tensorflow.org/tutorials/layers), saya mencatat bahwa parameter ini tidak diatur dalam kode. Misalnya:
# Convolutional Layer #1
conv1 = tf.layers.conv2d(
inputs=input_layer,
filters=32,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
Contoh kode dari tutorial berjalan tanpa kesalahan, jadi saya pikir default kernel_initializer
tidak Tidak ada
. Jadi, yang penginisialisasi digunakan?
Dalam kode lain, saya tidak menetapkan kernel_initializer
dari conv2d dan lapisan padat, dan semuanya baik-baik saja. Namun, ketika saya mencoba untuk mengatur kernel_initializer
untuk tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32)
, aku punya NaN kesalahan. Apa yang terjadi di sini? Siapapun dapat membantu?
Pertanyaan besar! Hal ini cukup sebuah trik untuk mencari tahu!
tf.lapisan-lapisan.conv2d
variable_scope.get_variable
: Dalam kode:
self.kernel = vs.get_variable('kernel',
shape=kernel_shape,
initializer=self.kernel_initializer,
regularizer=self.kernel_regularizer,
trainable=True,
dtype=self.dtype)
Langkah berikutnya: apa lingkup variabel dilakukan ketika penginisialisasi Ada?
Di sini dikatakan:
Jika penginisialisasi adalah
Tidak ada
(default), default penginisialisasi berlalu di konstruktor ini digunakan. Jika yang satu adalahTidak
juga, kita gunakan baruglorot_uniform_initializer
.
Jadi jawabannya adalah: ia menggunakan glorot_uniform_initializer
Untuk kelengkapan definisi ini penginisialisasi:
Glorot seragam initializer, juga disebut Xavier seragam initializer. Ia menarik sampel dari distribusi seragam dalam [-batas, batas] di mana
batas
adalahsqrt(6 / (fan_in + fan_out))
di manafan_in
adalah jumlah input unit berat tensor danfan_out
adalah jumlah output unit berat tensor. Referensi: http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf
Edit: ini adalah apa yang saya temukan dalam kode dan dokumentasi. Mungkin anda bisa memverifikasi bahwa inisialisasi terlihat seperti ini dengan menjalankan eval pada bobot!
Menurut [program ini](
oleh Andrew Ng dan Xavier dokumentasi, jika anda menggunakan Longgar sebagai fungsi aktivasi, lebih baik mengubah default bobot penginisialisasi(yang Xavier seragam) untuk Xavier normal oleh:y = tf.layers.conv2d(x, kernel_initializer=tf.contrib.layers.xavier_initializer(uniform=False), )