专栏首页AI黑科技工具箱新的正则化神器:DropBlock(Tensorflow实践)
原创

新的正则化神器:DropBlock(Tensorflow实践)

先上结论:

在我们测试mnist上,3层卷积+dropXXX,所有参数均为改变的情况下,可以提升mnist准确率1~2点;同样在近期的实际业务中,也取得了相当不错的结果,模型鲁棒性有明显提升


十月份天气凉爽的时候,网上出现了一篇挺有意思的文章:https://arxiv.org/pdf/1810.12890.pdf

Google Brain提出了一种新的正则化方法:DropBlock,一图说明原理:

图片来自于原文

我们平时使用更多的是经典的dropout,即在像素级别上加入一个bernoulli噪声信息,mask部分feature map的像素点(图b),但实际上我们的语义信息是完整、连续的,我们更希望其mask能够彻底block到某一块语义信息,从而提升其他部分的信息权重,实现模型正则约束泛化(图c),这样就诞生了 DropBlock。

这倒是让我想起来之前很推崇的一个数据增强方法:random erase

random erase方法

其思路是在原图上进行随机遮盖,从而实现模型能力泛化,而本质上input image就是第一层feature map,所以DropBlock可以认为是广义的Random Erase

实际上从之前的一些类似drop策略的文章上我们可以列举出一堆方法,作者也是在文章中一一提出并做了相应的策略比较:

  • Dropout:完全随机扔
  • SpatialDropout:按channel随机扔
  • Stochastic Depth:按res block随机扔
  • DropBlock:每个feature map上按spatial块随机扔
  • Cutout:在input层按spatial块随机扔
  • DropConnect:只在连接处扔,神经元不扔。

文章中,作者也是没有随意进行处理,而是选择有效的区域进行mask:

而在效果提升方面,作者对比了其性能效果:

ResNet-50分类效果

为了解释相应的网络泛化能力,模型还对图像做了响应区域解释:

可以明显发现,加入DropBlock之后,有效响应明显增强(但同时可能引来未可知的噪声?)

在目标检测方面,模型性能也同样有较好的性能提升:

分割效果:

(当然了fine-tune还是优秀)

我们自己亲自做一下实验:

这里,我们采用mnist来测试,非常简单的网络对飙dropout:

首先使用tensorflow.keras.layer做一个实现:

import tensorflow as tf
from tensorflow.python.keras import backend as K

class DropBlock(tf.keras.layers.Layer):
    def __init__(self, keep_prob, block_size, **kwargs):
        super(DropBlock, self).__init__(**kwargs)
        self.keep_prob = float(keep_prob) if isinstance(keep_prob, int) else keep_prob
        self.block_size = int(block_size)

    def compute_output_shape(self, input_shape):
        return input_shape

    def build(self, input_shape):
        _, self.h, self.w, self.channel = input_shape.as_list()
        # pad the mask
        bottom = right = (self.block_size - 1) // 2
        top = left = (self.block_size - 1) - bottom
        self.padding = [[0, 0], [top, bottom], [left, right], [0, 0]]
        self.set_keep_prob()
        super(DropBlock, self).build(input_shape)

    def call(self, inputs, training=None, scale=True, **kwargs):
        def drop():
            mask = self._create_mask(tf.shape(inputs))
            output = inputs * mask
            output = tf.cond(tf.constant(scale, dtype=tf.bool) if isinstance(scale, bool) else scale,
                             true_fn=lambda: output * tf.to_float(tf.size(mask)) / tf.reduce_sum(mask),
                             false_fn=lambda: output)
            return output

        if training is None:
            training = K.learning_phase()
        output = tf.cond(tf.logical_or(tf.logical_not(training), tf.equal(self.keep_prob, 1.0)),
                         true_fn=lambda: inputs,
                         false_fn=drop)
        return output

    def set_keep_prob(self, keep_prob=None):
        """This method only supports Eager Execution"""
        if keep_prob is not None:
            self.keep_prob = keep_prob
        w, h = tf.to_float(self.w), tf.to_float(self.h)
        self.gamma = (1. - self.keep_prob) * (w * h) / (self.block_size ** 2) / \
                     ((w - self.block_size + 1) * (h - self.block_size + 1))

    def _create_mask(self, input_shape):
        sampling_mask_shape = tf.stack([input_shape[0],
                                       self.h - self.block_size + 1,
                                       self.w - self.block_size + 1,
                                       self.channel])
        mask = DropBlock._bernoulli(sampling_mask_shape, self.gamma)
        mask = tf.pad(mask, self.padding)
        mask = tf.nn.max_pool(mask, [1, self.block_size, self.block_size, 1], [1, 1, 1, 1], 'SAME')
        mask = 1 - mask
        return mask

    @staticmethod
    def _bernoulli(shape, mean):
        return tf.nn.relu(tf.sign(mean - tf.random_uniform(shape, minval=0, maxval=1, dtype=tf.float32)))

首先做个脚本测试:

import tensorflow as tf
from dropblock import DropBlock

tf.enable_eager_execution()

# only support `channels_last` data format
a = tf.ones([2, 10, 10, 3])

drop_block = DropBlock(keep_prob=0.8, block_size=3)
b = drop_block(a, training=True)

print(a[0, :, :, 0])
print(b[0, :, :, 0])
image.png

结果也很明显,可以实现dropblock

结论:

在我们测试mnist上,3层卷积+dropXXX,所有参数均为改变的情况下,可以提升mnist准确率1~2点;同样在近些填的实际业务中,也取得了相当不错的结果,模型鲁棒性有明显提升。

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

  • Tensorflow实战(4)-TensorFlow的正则化实现

    在训练深度学习网络时,在损失函数上加上正则项是防止过拟合的一个重要方法。本文介绍两种在TensorFlow中如何加入正则化项的方法, 但无论何种方法大的逻辑都是...

    YoungTimes
  • 谷歌大脑提出DropBlock卷积正则化方法,显著改进CNN精度

    昨天arXiv新上一篇被NIPS2018会议接收的论文《DropBlock: A regularization method for convolutional...

    CV君
  • 深度学习系列教程(八)TensorFlow 中的正则化方法

    "玩转TensorFlow与深度学习模型”系列文字教程,本周带来TensorFlow 中的正则化方法! 大家在学习和实操过程中,有任何疑问都可以通过学院微信交流...

    企鹅号小编
  • 深度学习系列教程(八)TensorFlow 中的正则化方法

    "玩转TensorFlow与深度学习模型”系列文字教程,本周带来TensorFlow 中的正则化方法! 大家在学习和实操过程中,有任何疑问都可以通过学院微信交流...

    企鹅号小编
  • 面向隐私 AI 的 TensorFlow 深度定制化实践

    在这一篇文章中,我们结合 Rosetta 介绍如何定制化改造 TensorFlow 前后端相关组件,以集成 MPC 等隐私计算技术,同时保留对 TensorFl...

    代码医生工作室
  • 目标检测系列之五(YOLO V4)

    论文题目《YOLOv4: Optimal Speed and Accuracy of Object Detection》 论文地址:https://arxiv....

    Minerva
  • NIPS 2018 | Quoc Le提出卷积网络专属正则化方法DropBlock

    深度神经网络在具备大量参数、使用大量正则化和噪声时效果很好,如权重衰减和 dropout [1]。尽管 dropout 的首次成功与卷积网络相关,但近期的卷积架...

    机器之心
  • YOLO v4它来了:接棒者出现,速度效果双提升

    两个月前,YOLO 之父 Joseph Redmon 表示,由于无法忍受自己工作所带来的的负面影响,决定退出计算机视觉领域。此事引发了极大的热议,其中一个悬念就...

    机器之心
  • 涨点神器!SoftPool:一种新的池化方法,带你起飞!

    论文:https://arxiv.org/abs/2101.00440 项目代码链接:

    AI算法与图像处理
  • Dropout也能自动化了,谷歌Quoc Le等人利用强化学习自动找寻模型专用Dropout

    在机器学习领域里,Dropout 是一个较为重要的方法,其可以暂时丢弃一部分神经元及其连接,进而防止过拟合,同时指数级、高效地连接不同网络架构。

    CV君
  • Dropout也能自动化了,谷歌Quoc Le等人利用强化学习自动找寻模型专用Dropout

    在机器学习领域里,Dropout 是一个较为重要的方法,其可以暂时丢弃一部分神经元及其连接,进而防止过拟合,同时指数级、高效地连接不同网络架构。

    机器之心
  • Dropout也能自动化了,谷歌大神Quoc Le等人利用强化学习自动找寻模型专用Dropout

    在机器学习领域里,Dropout 是一个较为重要的方法,其可以暂时丢弃一部分神经元及其连接,进而防止过拟合,同时指数级、高效地连接不同网络架构。

    深度学习技术前沿公众号博主
  • 扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积、激活、初始化、正则

    我们对Keras应该已经有了一个直观、宏观的认识了。现在,我们来系统的学习一下Keras的一些关于网络层的API,本文的主要内容是围绕卷积展开的,包含以下的内容...

    机器学习炼丹术
  • ResNets王者回归!谷歌、伯克利联合发文:它当初输给EfficientNets不是架构问题

    谷歌大脑和UC伯克利近期联合发表了一篇论文,这篇论文对何恺明等人2015年发表的ResNet为骨干的ResNets系列网络做了重新的回顾和研究。

    AI科技评论
  • TensorFlow使用者的福音 – PerceptiLabs – TF的GUI和Visual API(TF的可视化神器)

    最近发布的PerceptiLabs 0.11已迅速成为TensorFlow的GUI和可视API。PerceptiLabs基于复杂的可视ML建模编辑器构建,您可以...

    计算机与AI
  • 超级干货 | 用万字文章总结25种正则化方法(值得收藏)

    卷积神经网络已经在一些与计算机视觉相关的任务上取得了相当不错的结果,如图像分类和目标检测。这种成功可以用卷积神经元的工作原理来解释:它根据图像的空间属性来突出给...

    集智书童公众号
  • 收藏!改善TensorFlow模型的4种方法-你需要了解的关键正则化技术(1)

    正则化技术对于防止模型过度拟合至关重要,并能使它们在验证和测试集上表现更好。本指南提供了可用于TensorFlow中正则化的四种关键方法的代码的全面概述。

    计算机与AI
  • 收藏!改善TensorFlow模型的4种方法-你需要了解的关键正则化技术(2)

    批处理规范化背后的主要思想是,在我们的案例中,我们通过使用几种技术(sklearn.preprocessing.StandardScaler)来规范化输入层,从...

    计算机与AI
  • 02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面(作业:初始化+正则化+梯度检验)

    笔记:02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面

    Michael阿明

扫码关注腾讯云开发者

领取腾讯云代金券