2B'deki Uzamsal Bırakma nasıl uygulanır?


14

Bu, Evrimsel Ağları Kullanarak Verimli Nesne Yerelleştirmesi'ne başvurmaktır ve anladığımdan ayrılma 2B'de uygulanır.

Keras'tan Mekansal 2D Bırakmanın nasıl uygulandığına ilişkin kodu okuduktan sonra, temelde rastgele bir ikili şekil maskesi [batch_size, 1, 1, num_channels] uygulanır. Ancak, bu uzamsal 2D Bırakma, şekil [batch_size, yükseklik, genişlik, num_kanallar] giriş evrişim bloğuna tam olarak ne yapar?

Mevcut tahminim, her piksel için, pikselin katmanlarından / kanallarından herhangi birinin negatif bir değeri varsa, bu pikselin tüm kanallarının varsayılan olarak sıfırlanacağıdır. Bu doğru mu?

Ancak, tahminim doğruysa, tam olarak orijinal giriş bloğunun boyutunda olan bir ikili şekil maskesi [batch_size, yükseklik, genişlik, num_channels] nasıl kullanılır? ikili maskenin şeklini girişin şekli olarak ayarlayan tensorflow'un orijinal bırakma uygulaması)? Çünkü bu, conv bloğundaki herhangi bir pikselin negatif olması anlamına gelir, o zaman tüm conv bloğu varsayılan olarak 0 olur. Bu, tam olarak anlamadığım kafa karıştırıcı kısımdır.

Yanıtlar:


14

Bu cevap biraz gecikti, ama bunu kendim ele almalıydım ve yardımcı olabileceğini düşündüm.

Makaleye baktığımızda, Uzamsal Bırakma'da, özellik piksellerinin tamamını (kanallar olarak da bilinir) tek tek 'pikseller' yerine rastgele olarak 0 olarak ayarladık.

Söyledikleri mantıklı, bitişik pikseller yüksek derecede korelasyonlu olduğu için düzenli bırakmanın görüntülerde o kadar iyi çalışmayacağı anlaşılıyor. Pikselleri rastgele gizlerseniz, sadece bitişik piksellere bakarak ne olduklarına dair iyi bir fikrim olabilir. Tüm özellik haritalarının kaldırılması, orijinal bırakma niyeti ile daha iyi hizalanabilir.

İşte tf.nn.dropout'a dayanan Tensorflow'da uygulayan bir işlev. Tf.nn.dropout'taki tek gerçek değişiklik, bırakma maskemizin şeklinin BatchSize * Genişlik * Yükseklik * NumFeatureMaps'in aksine BatchSize * 1 * 1 * NumFeatureMaps olmasıdır.

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

Umarım yardımcı olur!


3

Mevcut tahminim, her piksel için, pikselin katmanlarından / kanallarından herhangi birinin negatif bir değeri varsa, bu pikselin tüm kanallarının varsayılan olarak sıfırlanacağıdır. Bu doğru mu?

Burada tam olarak ne demek istediğinizden emin değilim ama bırakma maskesi, rastgele bırakma maskesi için çizilenler dışında herhangi bir değerden bağımsız olarak gerçekleşir. Bu düşüş, piksel değerlerinden , filtre ağırlıklarından veya özellik eşleme değerlerinden etkilenmez . Boyut [batch_size, 1, 1, num_channels]maskesi kullanırsanız, bırakma sırasında bu boyutta bir ikili maske alırsınız. Bu ikili maskedeki sıfırlar olasılıkla oluşur rate(en azından Keras uygulamasında, Dropoutkatmana ilk argüman ). Bu maske daha sonra özellik haritalarınızla çarpılır, böylece hangi maske boyutu 1 boyutunda olursa olsun - bu maske boyutu özellik harita şekline uyacak şekilde yayınlanır.
Daha basit bir durum düşünün - diyelim ki boyut özellik haritalarınız var [height, num_channels](şimdilik toplu boyutu göz ardı edelim) ve özellik harita değerleri şunlardır:

print(feature_maps)

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

print(feature_maps.shape)

(4, 3)

Ardından [1, num_channels], bunun gibi bir ikili bırakma maskesi düşünün :

print(dropout_mask)

[[0 1 0]]

print(dropout_mask.shape)

(1, 3)

Şimdi çarptığınızda ne olduğuna dikkat edin feature_mapsve dropout_mask:

print(feature_maps * dropout_mask)

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

İçindeki değerler dropout_maskher özellik haritasının yüksekliğiyle eşleşecek şekilde yayınlanmış ve daha sonra elemanlar arası çarpma gerçekleştirilmiştir. Sonuç olarak, tüm özellik haritaları sıfırlandı - ve tam olarak mekansal bırakma bunu yapıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.