DropBlock: 卷积层的正则化方法及复现代码

论文:https://arxiv.org/pdf/1810.12890.pdf

1、什么是Dropout?

我相信各位一定了解过Dropout,所谓Dropout就是提高神经网络泛化性一种方法,可以有效减轻过拟合。为什么它有效呢?从下图分析:

DropBlock: 卷积层的正则化方法及复现代码_第1张图片

一个标准的神经网络如图(a)所示,由于训练数据(假设为人脸数据)的局限性,使得神经网络很依赖于某一个神经元,而其他神经元相当于没有起作用,网络每次都只通过眼睛来判断是不是个人。如果此时直接拿一个全新的测试数据集让这个网络进行识别,很可能因为图片中眼睛被遮挡而得出错误的结果。这也是比较常见的过拟合现象。

那么如果我们像图(b)一样,随机失活几个神经元,迫使网络要让更多的神经元发挥作用,网络不仅识别人眼特征,而且还会识别嘴巴,鼻子等。这样在面对测试集时,即使训练数据和测试数据不同,准确率也不会太低。

2、DropBlock

dropout正则化方法广泛用于全连接层,且效果较好,然而对于卷基层却效果欠佳。因为卷基层来说的特征是空间相关的,仅仅在空间上随机地让一些神经元失活,相当于只让某几个像素点失活,而正常图像的特征大小远大于一个像素点,卷积层依然可以通过感知区域内其他没有失活的单元判断相应的特征,所以信息还是会通过卷基层送到下一层。

作者提出了DropBlock,一种结构化的dropout。它和dropout思想一样,也是随机丢弃,但一丢就丢一整块,如下图(c)所示。这样就迫使了卷积层的神经元不能通过空间上的特征关联推理出被失活的区域信息,进而迫使网络从其他特征进行推理,起到正则化作用。

DropBlock: 卷积层的正则化方法及复现代码_第2张图片

3、DropBlock算法流程

简单来说,就两步:

  1. 在特征图上随机选出两个点(和dropout一样的操作)
  2. 以这个点为中心,扩散固定大小的边长,然后把这个矩形块的神经元失活

但为了DropBlock的区域不超过特征层等等,还有一些超参数需要设置,详细的伪代码算法流程如下图所示:

DropBlock: 卷积层的正则化方法及复现代码_第3张图片

算法流程

  1. 输入一个特征层(A), b l o c k _ s i z e , γ , m o d e block\_size,\gamma,mode block_size,γ,mode三个参数
  2. 通过 m o d e mode mode判断模型是处于训练阶段还是预测阶段,如果是测试阶段,则直接返回特征层A
  3. 根据 γ \gamma γ,使用伯努利函数( B e r n o u l l i Bernoulli Bernoulli)生成只有0,1的矩阵M
  4. 每个0的格点作为中心点,创建形状为( b l o c k _ s i z e ∗ b l o c k _ s i z e block\_size * block\_size block_sizeblock_size)的空间正方形mask并将这个区域填0处理
  5. 将A与M点乘
  6. 为了该层具有相同的均值和方差,进行归一化操作

其中 γ \gamma γ的是通过计算得出的:
γ = 1 − k e e p _ p r o b ( b l o c k _ s i z e ) 2 ( f e a t _ s i z e ) 2 ( f e a t _ s i z e − b l o c k _ s i z e + 1 ) 2 \gamma = \frac{1 - keep\_prob}{(block\_size)^2}\frac{(feat\_size)^2}{(feat\_size-block\_size+1)^2} γ=(block_size)21keep_prob(feat_sizeblock_size+1)2(feat_size)2

  • k e e p _ p r o b keep\_prob keep_prob是和dropout一样保留神经元的概率,实验结果得出在0.75-0.95之间比较好
  • f e a t _ s i z e feat\_size feat_size是特征层的大小
  • ( f e a t _ s i z e − b l o c k _ s i z e + 1 ) 2 (feat\_size-block\_size+1)^2 (feat_sizeblock_size+1)2保证drop掉的区域不会超过特征层的大小

DropBlock调度

固定的 k e e p _ p r o b keep\_prob keep_prob在训练中不好。太小的 k e e p _ p r o b keep\_prob keep_prob会英雄一开始的训练,所以从1开始逐渐减小,模型鲁棒性会更强。

4、实验结果

DropBlock的准确率验证

所有的实验都是在ImageNet数据集上测试的,DropBlock( b l o c k _ s i z e = 7 block\_size=7 block_size=7)相比dropout,准确率大概有1.13%提升。

DropBlock: 卷积层的正则化方法及复现代码_第4张图片

Keep_prob的选取

主要对比了在不同 k e e p _ p r o b keep\_prob keep_prob数值下,DropBlock和DropBlock的影响。其中所有的drop方法都是在ResNet的group3和group4上进行的,结果显示在 k e e p _ p r o b = 0.9 keep\_prob=0.9 keep_prob=0.9时效果最好。

DropBlock: 卷积层的正则化方法及复现代码_第5张图片

Block_szie的选取

同样,所有的drop方法都是在ResNet的group3和group4上进行的,结果显示 b l o c k _ s i z e = 7 block\_size=7 block_size=7时效果最好。

DropBlock: 卷积层的正则化方法及复现代码_第6张图片

结果可视化

作者还在热力图上做了对比,我们可以清楚的看到, b l o c k _ s i z e = 1 block\_size=1 block_size=1时,特征激活区域有时会比不加DropBlock多,有时效果会差一些。这也很容易理解, b l o c k _ s i z e = 1 block\_size=1 block_size=1时DropBlock退化成dropout。而在 b l o c k _ s i z e = 7 block\_size=7 block_size=7时,特征激活区域明显多了很多。

DropBlock: 卷积层的正则化方法及复现代码_第7张图片

5、算法复现

这篇论文的作者并没有开源出相关的代码,可能是因为比较好复现。笔者本人用Keras的自定义层上进行了复现。

  • Keras-DropBlock

你可能感兴趣的:(深度学习技巧,图像分类,目标检测,神经网络,深度学习,算法)