Jika saya ingin menggunakan fungsi BatchNormalization di Keras, maka apakah saya perlu memanggilnya sekali saja di awal?
Saya membaca dokumentasi ini untuknya: http://keras.io/layers/normalization/
Saya tidak tahu di mana saya seharusnya menyebutnya. Di bawah ini adalah kode saya yang mencoba menggunakannya:
model = Sequential()
keras.layers.normalization.BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None)
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(64, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(2, init='uniform'))
model.add(Activation('softmax'))
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)
model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2)
Saya bertanya karena jika saya menjalankan kode dengan baris kedua termasuk normalisasi batch dan jika saya menjalankan kode tanpa baris kedua saya mendapatkan output yang sama. Jadi saya tidak memanggil fungsi di tempat yang tepat, atau saya kira itu tidak membuat banyak perbedaan.
Utas ini menyesatkan. Sudah mencoba mengomentari jawaban Lucas Ramadan, tapi saya belum memiliki hak yang tepat, jadi saya hanya akan menempatkan ini di sini.
Normalisasi batch berfungsi paling baik setelah fungsi aktivasi, dan sini atau di sini adalah alasannya: ia dikembangkan untuk mencegah pergeseran kovariat internal. Pergeseran kovariat internal terjadi ketika distribusi aktivasidari suatu lapisan bergeser secara signifikan selama pelatihan. Normalisasi batch digunakan sehingga distribusi input (dan input ini secara harfiah merupakan hasil dari fungsi aktivasi) ke lapisan tertentu tidak berubah dari waktu ke waktu karena pembaruan parameter dari setiap batch (atau setidaknya, memungkinkannya untuk berubah dengan cara yang menguntungkan). Ia menggunakan statistik batch untuk melakukan normalisasi, dan kemudian menggunakan parameter normalisasi batch (gamma dan beta di kertas asli) "untuk memastikan bahwa transformasi yang dimasukkan dalam jaringan dapat mewakili transformasi identitas" (kutipan dari kertas asli). Tetapi intinya adalah bahwa kita mencoba untuk menormalkan input ke suatu layer, jadi itu harus selalu pergi sebelum lapisan berikutnya dalam jaringan. Apakah itu atau tidak '
sumber
g(BN(Wx + b))
, di manag
adalah fungsi aktivasi.Utas ini memiliki beberapa perdebatan besar tentang apakah BN harus diterapkan sebelum non-linearitas lapisan saat ini atau untuk aktivasi lapisan sebelumnya.
Meskipun tidak ada jawaban yang benar, penulis Normalisasi Batch mengatakan bahwa itu harus diterapkan segera sebelum non-linearitas lapisan saat ini. Alasannya (dikutip dari kertas asli) -
sumber
Keras sekarang mendukung
use_bias=False
opsi ini, sehingga kami dapat menyimpan beberapa perhitungan dengan menulis likeatau
sumber
model.add(BatchNormalization())
berbeda darimodel.add(BatchNormalization(axis=bn_axis))
tensorflow
backend. Itu ditulis di sini karena dia menyalin ini darikeras.applications
modul, di manabn_axis
perlu ditentukan untuk mendukung formatchannels_first
dan keduanyachannels_last
.Sekarang hampir menjadi tren untuk
Conv2D
diikuti olehReLu
diikuti oleh sebuahBatchNormalization
lapisan. Jadi saya membuat fungsi kecil untuk memanggil mereka semua sekaligus. Membuat definisi model terlihat jauh lebih bersih dan lebih mudah dibaca.sumber
Ini adalah jenis lapisan lain, jadi Anda harus menambahkannya sebagai lapisan di tempat yang sesuai dengan model Anda
Lihat contoh di sini: https://github.com/fchollet/keras/blob/master/examples/kaggle_otto_nn.py
sumber
Batch Normalisasi digunakan untuk menormalkan lapisan input serta lapisan tersembunyi dengan menyesuaikan rata-rata dan penskalaan aktivasi. Karena efek normalisasi ini dengan lapisan tambahan dalam jaringan saraf yang dalam, jaringan dapat menggunakan tingkat pembelajaran yang lebih tinggi tanpa menghilangkan atau meledakkan gradien. Selain itu, normalisasi batch mengatur jaringan sehingga lebih mudah untuk digeneralisasi, dan karenanya tidak perlu menggunakan dropout untuk mengurangi overfitting.
Tepat setelah menghitung fungsi linear menggunakan say, the Dense () atau Conv2D () di Keras, kami menggunakan BatchNormalization () yang menghitung fungsi linear dalam sebuah layer dan kemudian kami menambahkan non-linearitas ke layer menggunakan Activation ().
Bagaimana Normalisasi Batch diterapkan?
Misalkan kita memiliki input [l-1] ke layer l. Kami juga memiliki bobot W [l] dan satuan bias b [l] untuk lapisan l. Biarkan [l] menjadi vektor aktivasi yang dihitung (yaitu setelah menambahkan non-linearitas) untuk layer l dan z [l] menjadi vektor sebelum menambahkan non-linearitas
Sekarang tentukan parameter baru γ dan β yang akan mengubah skala lapisan tersembunyi sebagai berikut:
z_norm [l] = γ.Z_temp [l] + β
Dalam kutipan kode ini, Dense () mengambil a [l-1], menggunakan W [l] dan menghitung z [l]. Maka BatchNormalization langsung () akan melakukan langkah-langkah di atas untuk memberikan z_norm [l]. Dan kemudian Aktivasi langsung () akan menghitung tanh (z_norm [l]) untuk memberikan [l] yaitu
sumber