Bagaimana Dropout Spatial dalam 2D ​​diterapkan?

14

Ini dengan merujuk pada kertas Pelokalan Objek Efisien Menggunakan Jaringan Konvolusional , dan dari apa yang saya pahami dropout diimplementasikan dalam 2D.

Setelah membaca kode dari Keras tentang bagaimana Dropout 2D Spasial diimplementasikan, pada dasarnya bentuk biner acak [batch_size, 1, 1, num_channels] diimplementasikan. Namun, apa sebenarnya yang dilakukan Dropout 2D spasial ini ke blok konvolusi input [batch_size, tinggi, lebar, num_channels]?

Dugaan saya saat ini adalah bahwa untuk setiap piksel, jika salah satu lapisan / saluran piksel memiliki nilai negatif, seluruh saluran dari satu piksel tersebut akan disetel ke nol. Apakah ini benar?

Namun, jika dugaan saya benar, maka bagaimana cara menggunakan topeng biner bentuk [batch_size, tinggi, lebar, num_channels] yang persis dalam dimensi blok input asli memberikan dropout elemen-bijaksana seperti biasa (ini sesuai dengan Implementasi dropout asli tensorflow yang menetapkan bentuk topeng biner sebagai bentuk input)? Karena itu berarti jika ada pixel di blok conv negatif, maka seluruh blok conv akan default ke 0. Ini adalah bagian yang membingungkan saya tidak begitu mengerti.

infomin101
sumber

Jawaban:

14

Tanggapan ini agak terlambat, tetapi saya perlu mengatasi ini sendiri dan berpikir itu mungkin bisa membantu.

Melihat kertas, tampaknya bahwa dalam Dropout Spasial, kami secara acak mengatur seluruh peta fitur (juga dikenal sebagai saluran) ke 0, daripada 'piksel' individu.

Masuk akal apa yang mereka katakan, bahwa dropout reguler tidak akan bekerja dengan baik pada gambar karena piksel yang berdekatan sangat berkorelasi. Jadi, jika Anda menyembunyikan piksel secara acak, saya masih dapat memiliki ide bagus tentang apa itu hanya dengan melihat piksel yang berdekatan. Menghapus seluruh peta fitur mungkin lebih selaras dengan niat awal dropout.

Berikut adalah fungsi yang mengimplementasikannya di Tensorflow, berdasarkan tf.nn.dropout. Satu-satunya perubahan nyata dari tf.nn.dropout adalah bentuk topeng putus sekolah kami adalah BatchSize * 1 * 1 * NumFeatureMaps, berbeda dengan BatchSize * Lebar * Tinggi * NumFeatureMaps

def spatial_dropout(x, keep_prob, seed=1234):
    # x is a convnet activation with shape BxWxHxF where F is the 
    # number of feature maps for that layer
    # keep_prob is the proportion of feature maps we want to keep

    # get the batch size and number of feature maps
    num_feature_maps = [tf.shape(x)[0], tf.shape(x)[3]]

    # get some uniform noise between keep_prob and 1 + keep_prob
    random_tensor = keep_prob
    random_tensor += tf.random_uniform(num_feature_maps,
                                       seed=seed,
                                       dtype=x.dtype)

    # if we take the floor of this, we get a binary matrix where
    # (1-keep_prob)% of the values are 0 and the rest are 1
    binary_tensor = tf.floor(random_tensor)

    # Reshape to multiply our feature maps by this tensor correctly
    binary_tensor = tf.reshape(binary_tensor, 
                               [-1, 1, 1, tf.shape(x)[3]])
    # Zero out feature maps where appropriate; scale up to compensate
    ret = tf.div(x, keep_prob) * binary_tensor
    return ret

Semoga itu bisa membantu!

nlml
sumber
3

Dugaan saya saat ini adalah bahwa untuk setiap piksel, jika salah satu lapisan / saluran piksel memiliki nilai negatif, seluruh saluran dari satu piksel tersebut akan disetel ke nol. Apakah ini benar?

Saya tidak yakin persis apa yang Anda maksud di sini, tetapi dropout terjadi terlepas dari nilai apa pun selain yang diambil secara acak untuk dropout mask. Yaitu dropout tidak terpengaruh oleh nilai piksel , bobot filter atau nilai peta fitur. Jika Anda menggunakan topeng ukuran [batch_size, 1, 1, num_channels]Anda akan mendapatkan topeng biner ukuran ini selama putus. Nol dalam topeng biner terjadi dengan probabilitas rate(setidaknya dalam implementasi Keras, argumen pertama ke Dropoutlapisan). Topeng ini kemudian dikalikan dengan peta fitur Anda, jadi dimensi mask mana pun yang berukuran 1 - dimensi mask itu disiarkan agar sesuai dengan Anda yang menampilkan bentuk peta.
Bayangkan situasi yang lebih sederhana - katakanlah Anda memiliki peta ukuran fitur [height, num_channels](mari kita abaikan ukuran bets untuk saat ini) dan nilai-nilai peta fitur Anda adalah:

print(feature_maps)

[[2 1 4]
 [1 3 2]
 [5 2 6]
 [2 2 1]]

print(feature_maps.shape)

(4, 3)

Lalu bayangkan topeng putus sekolah biner ukuran [1, num_channels], seperti ini:

print(dropout_mask)

[[0 1 0]]

print(dropout_mask.shape)

(1, 3)

Sekarang perhatikan apa yang terjadi ketika Anda mengalikan feature_mapsdan dropout_mask:

print(feature_maps * dropout_mask)

[[0 1 0]
 [0 3 0]
 [0 2 0]
 [0 2 0]]

Nilai-nilai dalam dropout_maskdisiarkan untuk mencocokkan ketinggian masing-masing peta fitur dan kemudian penggandaan elemen demi elemen dilakukan. Sebagai hasilnya, seluruh peta fitur mendapat titik nol - dan itulah yang dilakukan dropout spasial.

mmagnuski
sumber