Sunting: Seperti yang ditunjukkan oleh @Toke Faurby, implementasi default di tensorflow sebenarnya menggunakan dropout elemen-bijaksana. Apa yang saya jelaskan sebelumnya berlaku untuk varian khusus dropout di CNN, yang disebut dropout spasial :
Dalam CNN, setiap neuron menghasilkan satu peta fitur. Karena dropout spasial dropout bekerja per-neuron, menjatuhkan neuron berarti bahwa peta fitur yang sesuai dijatuhkan - misalnya setiap posisi memiliki nilai yang sama (biasanya 0). Jadi masing-masing peta fitur dijatuhkan sepenuhnya atau tidak dijatuhkan sama sekali.
Pooling biasanya beroperasi secara terpisah pada setiap peta fitur, jadi seharusnya tidak ada bedanya jika Anda menerapkan dropout sebelum atau sesudah pooling. Setidaknya ini adalah kasus untuk operasi pengumpulan seperti maxpooling atau rata-rata.
Sunting: Namun, jika Anda benar-benar menggunakan dropout elemen-bijaksana (yang tampaknya ditetapkan sebagai default untuk tensorflow), itu sebenarnya membuat perbedaan jika Anda menerapkan dropout sebelum atau setelah pengumpulan. Namun, tidak selalu ada cara yang salah untuk melakukannya. Pertimbangkan operasi pengumpulan rata-rata: jika Anda menerapkan dropout sebelum pengumpulan, Anda secara efektif mengukur aktivasi neuron yang dihasilkan 1.0 - dropout_probability
, tetapi sebagian besar neuron akan menjadi nol (secara umum). Jika Anda menerapkan dropout setelah pooling rata-rata, Anda biasanya berakhir dengan sebagian kecil (1.0 - dropout_probability)
aktivasi neuron "non-nol" dan sebagian kecil dari dropout_probability
neuron nol. Keduanya tampak masuk akal bagi saya, tidak ada yang salah.
Tutorial ini menggunakan pengumpulan sebelum putus dan mendapatkan hasil yang baik.
Itu tidak selalu berarti bahwa tatanan lainnya tidak berfungsi tentu saja. Pengalaman saya terbatas, saya hanya menggunakannya pada lapisan padat tanpa penyatuan.
sumber
Contoh convnet seperti VGG dari Keras (dropout digunakan setelah pengumpulan):
sumber