Spatial Dropout ใน 2D นำมาใช้อย่างไร


14

นี่คือการอ้างอิงถึงกระดาษการแปลภาษาอย่างมีประสิทธิภาพของวัตถุโดยใช้เครือข่าย Convolutionalและจากสิ่งที่ฉันเข้าใจว่าการใช้งานกลางคันนั้นเป็นแบบ 2D

หลังจากอ่านรหัสจาก Keras เกี่ยวกับวิธีการนำ Spatial 2D Dropout ไปใช้โดยทั่วไปจะมีหน้ากากรูปแบบไบนารีแบบสุ่ม [batch_size, 1, 1, num_channels] อย่างไรก็ตาม Dropout 2D เชิงพื้นที่นี้ทำอะไรกับบล็อก Convolution อินพุตของรูปร่างอย่างแน่นอน [batch_size, ส่วนสูง, ความกว้าง, num_channels]

การคาดเดาปัจจุบันของฉันคือว่าสำหรับแต่ละพิกเซลถ้าเลเยอร์ / ช่องใด ๆ ของพิกเซลมีค่าเป็นลบช่องทั้งหมดของพิกเซลนั้นจะมีค่าเริ่มต้นเป็นศูนย์ ถูกต้องหรือไม่

อย่างไรก็ตามถ้าการเดาของฉันถูกต้องแล้วการใช้รูปแบบไบนารีของรูปร่าง [batch_size, ความสูง, ความกว้าง, num_channels] ที่อยู่ในมิติของบล็อกอินพุตดั้งเดิมจะให้องค์ประกอบแบบปกติที่ชาญฉลาด (นี่คือตาม การใช้งานแบบเลื่อนลงของ tensorflow ที่กำหนดรูปร่างของไบนารีมาสก์เป็นรูปร่างของอินพุต) เพราะมันจะหมายความว่าหากพิกเซลใด ๆ ในบล็อกการแปลงเป็นลบดังนั้นบล็อกการแปลงทั้งหมดจะเริ่มต้นที่ 0 นี่คือส่วนที่สร้างความสับสนที่ฉันไม่ค่อยเข้าใจ

คำตอบ:


14

คำตอบนี้ช้าไปหน่อย แต่ฉันต้องพูดกับตัวเองและคิดว่ามันอาจช่วยได้

เมื่อดูที่กระดาษดูเหมือนว่าใน Spatial Dropout เราสุ่มตั้งค่าคุณสมบัติแผนที่ทั้งหมด (หรือที่รู้จักกันในชื่อแชแนล) เป็น 0 แทนที่จะเป็น 'พิกเซล' แต่ละรายการ

มันสมเหตุสมผลที่สิ่งที่พวกเขาพูดว่าการออกกลางคันปกติจะใช้งานไม่ได้ดีกับรูปภาพ ดังนั้นหากคุณซ่อนพิกเซลแบบสุ่มฉันยังคงมีความคิดที่ดีว่าพวกเขาเป็นอย่างไรโดยดูที่พิกเซลที่อยู่ติดกัน การปล่อยแผนที่คุณลักษณะทั้งหมดอาจสอดคล้องกับความตั้งใจเดิมในการออกกลางคัน

นี่คือฟังก์ชันที่ใช้ใน Tensorflow โดยอิงตาม tf.nn.dropout การเปลี่ยนแปลงที่แท้จริงเพียงอย่างเดียวจาก tf.nn.dropout คือรูปร่างของมาสก์แบบดรอปเอาท์ของเราคือ BatchSize * 1 * 1 * NumFeatureMaps ซึ่งตรงข้ามกับ BatchSize * กว้าง * สูง * สูง * 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

หวังว่าจะช่วย!


3

การคาดเดาปัจจุบันของฉันคือว่าสำหรับแต่ละพิกเซลถ้าเลเยอร์ / ช่องใด ๆ ของพิกเซลมีค่าเป็นลบช่องทั้งหมดของพิกเซลนั้นจะมีค่าเริ่มต้นเป็นศูนย์ ถูกต้องหรือไม่

ฉันไม่แน่ใจว่าคุณหมายถึงอะไรที่นี่ แต่การออกกลางคันเกิดขึ้นโดยไม่คำนึงถึงค่าใด ๆ นอกเหนือไปจากการสุ่มมาสก์สำหรับการออกกลางคัน นั่นคือการออกกลางคันไม่ได้รับผลกระทบจากค่าพิกเซลน้ำหนักตัวกรองหรือค่าการแมปคุณสมบัติ หากคุณใช้รูปแบบของขนาด[batch_size, 1, 1, num_channels]คุณจะได้รับรูปแบบไบนารีของขนาดนี้ในระหว่างการออกกลางคัน ค่าศูนย์ในมาสก์ไบนารีนั้นเกิดขึ้นกับความน่าจะเป็นrate(อย่างน้อยในการใช้ Keras, อาร์กิวเมนต์แรกเป็นDropoutเลเยอร์) จากนั้นมาสก์นี้จะถูกคูณด้วยแผนที่คุณลักษณะของคุณดังนั้นขนาดของรูปแบบใดที่มีขนาด 1 - มิติของรูปแบบนั้นจะออกอากาศเพื่อให้ตรงกับรูปร่างของแผนที่
ลองนึกภาพสถานการณ์ที่ง่ายกว่า - สมมติว่าคุณมีคุณสมบัติแผนที่ขนาด[height, num_channels](ลองเพิกเฉยขนาดชุดเป็นตอนนี้) และคุณคุณสมบัติค่าแผนที่คือ:

print(feature_maps)

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

print(feature_maps.shape)

(4, 3)

จากนั้นลองนึกภาพหน้ากากขนาดคร่อมแบบไบนารี[1, num_channels]เช่นนี้

print(dropout_mask)

[[0 1 0]]

print(dropout_mask.shape)

(1, 3)

สังเกตว่าเกิดอะไรขึ้นเมื่อคุณคูณfeature_mapsและdropout_mask:

print(feature_maps * dropout_mask)

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

ค่าในdropout_maskถูกออกอากาศเพื่อให้ตรงกับความสูงของแต่ละแผนที่คุณลักษณะแล้วทำการคูณองค์ประกอบโดยองค์ประกอบ ผลที่ตามมาคือการแมปฟีเจอร์ทั้งหมดได้กลายเป็นศูนย์ - และนั่นคือสิ่งที่ dropout เชิงพื้นที่ทำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.