¿Cómo se implementa el abandono espacial en 2D?

14

Esto se refiere al documento Localización eficiente de objetos mediante redes convolucionales , y por lo que entiendo, el abandono se implementa en 2D.

Después de leer el código de Keras sobre cómo se implementa el Dropout 2D espacial, básicamente se implementa una máscara binaria aleatoria de forma [batch_size, 1, 1, num_channels]. Sin embargo, ¿qué le hace exactamente este Dropout 2D espacial al bloque de convolución de entrada de forma [batch_size, height, width, num_channels]?

Mi conjetura actual es que para cada píxel, si alguna de las capas / canales del píxel tiene un valor negativo, todos los canales de ese píxel estarán predeterminados a cero. ¿Es esto correcto?

Sin embargo, si mi suposición es correcta, entonces, ¿cómo el uso de una máscara binaria de forma [lote_tamaño, altura, ancho, número_canales] que están exactamente en la dimensión del bloque de entrada original da el abandono habitual de elementos (esto está de acuerdo con el ¿La implementación de deserción original de tensorflow que establece la forma de la máscara binaria como la forma de la entrada)? Debido a que significaría que si cualquier píxel en el bloque conv es negativo, entonces el bloque conv completo estará predeterminado en 0. Esta es la parte confusa que no entiendo del todo.

infomin101
fuente

Respuestas:

14

Esta respuesta llega un poco tarde, pero necesitaba abordar esto yo mismo y pensé que podría ayudar.

Al observar el documento, parece que en Spatial Dropout, establecemos aleatoriamente mapas de entidades completos (también conocidos como canales) en 0, en lugar de 'píxeles' individuales.

Tiene sentido lo que dicen, que el abandono regular no funcionaría tan bien en las imágenes porque los píxeles adyacentes están altamente correlacionados. Entonces, si ocultas los píxeles al azar, aún puedo tener una buena idea de lo que eran simplemente mirando los píxeles adyacentes. La eliminación de mapas completos de características podría estar mejor alineada con la intención original de abandonar.

Aquí hay una función que lo implementa en Tensorflow, basado en tf.nn.dropout. El único cambio real de tf.nn.dropout es que la forma de nuestra máscara de omisión es BatchSize * 1 * 1 * NumFeatureMaps, a diferencia de 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

¡Espero que ayude!

nlml
fuente
3

Mi conjetura actual es que para cada píxel, si alguna de las capas / canales del píxel tiene un valor negativo, todos los canales de ese píxel estarán predeterminados a cero. ¿Es esto correcto?

No estoy seguro de qué quiere decir exactamente aquí, pero el abandono ocurre independientemente de cualquier valor que no sea el que se extrae al azar para la máscara de abandono. Es decir, la deserción no se ve afectada por los valores de píxeles , los pesos de filtro o los valores del mapa de características. Si usa una máscara de tamaño [batch_size, 1, 1, num_channels], obtendrá una máscara binaria de este tamaño durante el abandono. Los ceros en esa máscara binaria ocurren con probabilidad rate(al menos en la implementación de Keras, primer argumento para la Dropoutcapa). Esta máscara luego se multiplica por sus mapas de entidades, por lo que la dimensión de la máscara es de tamaño 1: esa dimensión de máscara se transmite para que coincida con la forma del mapa de entidades.
Imagine una situación más simple: supongamos que tiene mapas de características de tamaño [height, num_channels](ignoremos el tamaño del lote por ahora) y sus valores de mapas de características son:

print(feature_maps)

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

print(feature_maps.shape)

(4, 3)

Luego imagine una máscara binaria de tamaño [1, num_channels], como esta:

print(dropout_mask)

[[0 1 0]]

print(dropout_mask.shape)

(1, 3)

Ahora observe lo que sucede cuando multiplica feature_mapsy dropout_mask:

print(feature_maps * dropout_mask)

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

Los valores en dropout_maskse emitieron para coincidir con la altura de cada mapa de características y luego se realizó la multiplicación elemento por elemento. Como resultado, los mapas de características completas se redujeron a cero, y eso es exactamente lo que hace la deserción espacial.

mmagnuski
fuente