2D의 공간 드롭 아웃은 어떻게 구현됩니까?


14

이것은 Convolutional Networks를 사용한 Efficient Object Localization 이라는 논문 과 관련이 있으며, 내가 이해 한 것은 이탈이 2D로 구현 된다는 것입니다.

Spatial 2D Dropout의 구현 방식에 대한 Keras의 코드를 읽은 후 기본적으로 [batch_size, 1, 1, num_channels] 형태의 임의의 이진 마스크가 구현됩니다. 그러나이 공간적 2D 드롭 아웃은 모양 [batch_size, height, width, num_channels]의 입력 회선 블록과 정확히 어떤 관계가 있습니까?

필자의 현재 추측은 각 픽셀에 대해 픽셀의 레이어 / 채널 중 하나가 음수 값을 갖는 경우 해당 픽셀의 전체 채널은 기본적으로 0으로 설정됩니다. 이 올바른지?

그러나 내 추측이 맞다면 원래 입력 블록의 치수에 정확하게있는 모양의 이진 마스크 ​​(batch_size, height, width, num_channels)를 사용하면 일반적인 요소 별 드롭 아웃이 어떻게됩니까? 바이너리 마스크의 모양을 입력의 모양으로 설정하는 tensorflow의 원래 드롭 아웃 구현)? 그러면 conv 블록의 픽셀이 음수이면 전체 conv 블록의 기본값은 0으로 설정됩니다. 이것은 내가 이해하지 못하는 혼란스러운 부분입니다.

답변:


14

이 답변은 약간 늦었지만 직접 해결해야하며 도움이 될 것으로 생각했습니다.

논문을 보면 Spatial Dropout에서 개별 '픽셀'이 아닌 전체 기능 맵 (채널이라고도 함)을 임의로 0으로 설정 한 것으로 보입니다.

인접한 픽셀은 서로 밀접하게 관련되어 있기 때문에 규칙적인 드롭 아웃이 이미지에서 잘 작동하지 않는다는 것이 의미가 있습니다. 따라서 픽셀을 무작위로 숨기면 인접한 픽셀을 보면서 픽셀이 무엇인지 알 수 있습니다. 전체 피처 맵을 삭제하는 것이 원래의 드롭 아웃 의도에 더 잘 맞을 수 있습니다.

다음은 tf.nn.dropout을 기반으로 Tensorflow에서 구현하는 함수입니다. tf.nn.dropout의 유일한 변경 사항은 드롭 아웃 마스크의 모양이 BatchSize * Width * Height * NumFeatureMaps와 반대로 BatchSize * 1 * 1 * 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

필자의 현재 추측은 각 픽셀에 대해 픽셀의 레이어 / 채널 중 하나가 음수 값을 갖는 경우 해당 픽셀의 전체 채널은 기본적으로 0으로 설정됩니다. 이 올바른지?

정확히 여기에서 무슨 뜻인지 확실하지 않지만 드롭 아웃 마스크에 무작위로 그려진 값 이외의 값에 관계없이 드롭 아웃이 발생합니다. 드롭 아웃은 픽셀 값 , 필터 가중치 또는 기능 맵 값의 영향을받지 않습니다 . 크기의 마스크를 사용하면 [batch_size, 1, 1, num_channels]드롭 아웃 중에이 크기의 이진 마스크를 얻게됩니다. 이진 마스크의 0은 확률로 발생합니다 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]과 같이 size의 이진 드롭 아웃 마스크를 상상해보십시오 .

print(dropout_mask)

[[0 1 0]]

print(dropout_mask.shape)

(1, 3)

이제 곱하면 다음 feature_mapsdropout_mask같은 일이 발생합니다 .

print(feature_maps * dropout_mask)

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

의 값 dropout_mask은 각 특징 맵의 높이와 일치하도록 브로드 캐스트 된 다음 요소 별 곱셈이 수행되었습니다. 결과적으로 전체 기능 맵이 제로화되었습니다. 이것이 바로 공간 드롭 아웃의 기능입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.