Spoutial Dropout trong 2D được triển khai như thế nào?


14

Điều này là với sự giới thiệu đối với Bản địa hóa đối tượng hiệu quả bằng cách sử dụng Mạng kết hợp và từ những gì tôi hiểu, việc bỏ học được thực hiện trong 2D.

Sau khi đọc mã từ Keras về cách triển khai Dropout Spatial 2D, về cơ bản, mặt nạ nhị phân ngẫu nhiên có hình dạng [batch_size, 1, 1, num_channels] được triển khai. Tuy nhiên, 2D Dropout không gian này chính xác làm gì với khối tích chập đầu vào có hình dạng [batch_size, height, width, num_channels]?

Dự đoán hiện tại của tôi là đối với mỗi pixel, nếu bất kỳ lớp / kênh nào của pixel có giá trị âm, toàn bộ các kênh của một pixel đó sẽ được mặc định là 0. Điều này có đúng không?

Tuy nhiên, nếu dự đoán của tôi là chính xác, thì việc sử dụng mặt nạ nhị phân có hình dạng [batch_size, height, width, num_channels] chính xác theo chiều của khối đầu vào ban đầu sẽ đưa ra thông số phần tử thông thường (điều này là theo Thực hiện bỏ học ban đầu của tenorflow đặt hình dạng của mặt nạ nhị phân là hình dạng của đầu vào)? Bởi vì điều đó có nghĩa là nếu bất kỳ pixel nào trong khối đối lưu là âm, thì toàn bộ khối đối lưu sẽ được mặc định là 0. Đây là phần khó hiểu mà tôi không hiểu lắm.

Câu trả lời:


14

Phản hồi này hơi muộn, nhưng tôi cần tự giải quyết vấn đề này và nghĩ rằng nó có thể giúp ích.

Nhìn vào tờ giấy, có vẻ như trong Spatial Dropout, chúng tôi đặt ngẫu nhiên toàn bộ bản đồ tính năng (còn được gọi là kênh) thành 0, thay vì 'pixel' riêng lẻ.

Điều này có ý nghĩa với những gì họ đang nói, rằng việc bỏ học thông thường sẽ không hoạt động tốt trên hình ảnh vì các pixel liền kề có tương quan cao. Vì vậy, nếu bạn ẩn pixel ngẫu nhiên, tôi vẫn có thể biết được chúng là gì chỉ bằng cách nhìn vào các pixel liền kề. Bỏ toàn bộ bản đồ tính năng có thể được liên kết tốt hơn với ý định bỏ học ban đầu.

Đây là một hàm thực hiện nó trong Tensorflow, dựa trên tf.nn.dropout. Sự thay đổi thực sự duy nhất từ ​​tf.nn.dropout là hình dạng của mặt nạ bỏ học của chúng tôi là BatchSize * 1 * 1 * NumFeatureMaps, trái ngược với BatchSize * Width * height * 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

Mong rằng sẽ giúp!


3

Dự đoán hiện tại của tôi là đối với mỗi pixel, nếu bất kỳ lớp / kênh nào của pixel có giá trị âm, toàn bộ các kênh của một pixel đó sẽ được mặc định là 0. Điều này có đúng không?

Tôi không chắc chắn chính xác những gì bạn muốn nói ở đây nhưng việc bỏ học xảy ra bất kể giá trị nào khác với những giá trị được rút ngẫu nhiên cho mặt nạ bỏ học. Đó là việc bỏ học không bị ảnh hưởng bởi các giá trị pixel , trọng lượng bộ lọc hoặc các giá trị bản đồ đặc trưng. Nếu bạn sử dụng mặt nạ kích thước, [batch_size, 1, 1, num_channels]bạn sẽ nhận được mặt nạ nhị phân có kích thước này trong thời gian bỏ học. Số không trong mặt nạ nhị phân đó xảy ra với xác suất rate(ít nhất là trong triển khai Keras, đối số đầu tiên cho Dropoutlớp). Mặt nạ này sau đó được nhân với các bản đồ đặc trưng của bạn, do đó, bất kỳ kích thước mặt nạ nào có kích thước 1 - kích thước mặt nạ đó được phát để phù hợp với hình dạng bản đồ của bạn.
Hãy tưởng tượng một tình huống đơn giản hơn - giả sử bạn có các bản đồ kích thước tính năng [height, num_channels](bây giờ hãy bỏ qua kích thước lô) và bạn có các giá trị bản đồ là:

print(feature_maps)

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

print(feature_maps.shape)

(4, 3)

Sau đó hãy tưởng tượng một mặt nạ nhị phân có kích thước [1, num_channels], như thế này:

print(dropout_mask)

[[0 1 0]]

print(dropout_mask.shape)

(1, 3)

Bây giờ hãy chú ý những gì xảy ra khi bạn nhân lên feature_mapsdropout_mask:

print(feature_maps * dropout_mask)

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

Các giá trị trong dropout_maskđược phát ra để phù hợp với chiều cao của từng bản đồ tính năng và sau đó phép nhân từng yếu tố được thực hiện. Kết quả là toàn bộ các bản đồ tính năng đã bị loại bỏ - và đó chính xác là những gì bỏ qua không gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.