如何实现2D中的空间缺失?


14

这参考了论文《使用卷积网络进行有效对象本地化》,据我了解,辍学是在2D中实现的。

从Keras阅读有关如何实现Spatial 2D Dropout的代码后,基本上实现了形状为[batch_size,1,1,num_channels]的随机二进制掩码。但是,此空间2D Dropout对形状为[batch_size,height,width,num_channels]的输入卷积块究竟做了什么?

我目前的猜测是,对于每个像素,如果像素的任何层/通道具有负值,则该一个像素的整个通道将默认为零。它是否正确?

但是,如果我的猜测是正确的,那么如何使用与原始输入块的尺寸完全相同的形状[batch_size,height,width,num_channels]的二进制掩码会产生通常的按元素丢弃(这是根据tensorflow的原始dropout实现将二进制掩码的形状设置为输入的形状)?因为这意味着如果conv块中的任何像素为负,则整个conv块将默认为0。这是我不太了解的令人困惑的部分。

Answers:


14

这个回应有点晚了,但是我需要亲自解决这个问题,并认为这可能会有所帮助。

查看该论文,似乎在“空间缺失”中,我们将整个要素贴图(也称为通道)随机设置为0,而不是单个的“像素”。

他们说的是有道理的,因为相邻像素高度相关,所以常规的丢包对图像效果不佳。因此,如果您随机隐藏像素,仅查看相邻像素,我仍然可以很好地了解它们是什么。删除整个功能图可能会更好地与删除的初衷保持一致。

这是一个基于tf.nn.dropout在Tensorflow中实现它的函数。与tf.nn.dropout相比,唯一真正的变化是,我们的退出蒙版的形状是BatchSize * 1 * 1 * NumFeatureMaps,而不是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

希望有帮助!


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)

然后想象一个二进制大小的dropout掩码[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广播中的值以匹配每个特征图的高度,然后执行逐个元素的乘法。结果,整个要素图被清零了-这正是空间缺失的作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.