SpatialDropout是Tompson等人在图像领域提出的一种dropout方法。普通的dropout会随机地将部分元素置零,而SpatialDropout会随机地将部分区域置零,该dropout方法在图像识别领域实践证明是有效的。

dropout

dropout是怎么操作的?一般来说,对于输入的张量x,dropout就是随机地将部分元素置零,然后对结果做一个尺度变换。比如,我们随机初始化一个5x10的二维矩阵,即;

import numpy as np
x = np.random.random((4,5))
print(x)
def Dropout(x,drop_proba):return x * np.random.choice([0,1],x.shape,p = [drop_proba,1-drop_proba]) / (1. - drop_proba)
print(Dropout(x,0.5))
# x
[[0.56189429 0.03603615 0.97580132 0.36180956 0.55606632][0.81176104 0.47364453 0.97262952 0.04289464 0.42820463][0.26016082 0.61274373 0.10307323 0.84194222 0.48404058][0.37371407 0.88847782 0.37580269 0.97473358 0.7809447 ]]# dropout(x,0.5)
[[0.         0.07207229 0.         0.         1.11213264][1.62352208 0.         1.94525904 0.08578928 0.        ][0.52032163 1.22548745 0.         0.         0.        ][0.         1.77695563 0.75160539 1.94946716 0.        ]]

可以看到,Dropout操作随机地将部分元素置零,并且对非零部分做了一个尺度变换。尺度变换的幅度跟初始化的drop_rate有关。

作用

一般,我们会将dropout理解为“一种低成本的集成策略”,这是对的,具体过程可以大概这样理解:
经过上述置零操作后,我们可以认为零的部分是被丢弃的,丢失了一部分信息。因而,逼着模型用剩下的信息区拟合目标。然而每次dropout是随机的。我们就不能侧重于某些节点,所以总的来说就是—每次逼着模型用少量的特征学习,每次被学习的特征又不同,那么就是说,每个特征都应该对
模型的预测有所贡献(而不是侧重于部分特征,导致过拟合)。

SpatialDropout

接下来,我们来详细看看keras模块中SpatialDropout具体做了啥,如下图所示:

左:普通的dropout,右:SpatialDropout

首先,让我们看看SpatialDropout1D的输入和输出。SpatialDropout1D的输入是三维张量(samples,timesteps,channels),输出的纬度与输入的纬度相同。

我们以文本为例,一个文本的三维张量可以表示为(samples,sequence_length,embedding_dim),其中:

  • sequence_length表示句子的长度
  • embedding_dim表示词向量的纬度
    如下图所示:

当我们对该张量使用dropout技术时,你会发现普通的dropout会随机独立地将部分元素置零,而SpatialDropout1D会随机地对某个特定的纬度全部置零,如下图所示:

左:普通的dropout,右:SpatialDropout1D

接下来,我们简单的以一个简单的案例说明,首先,我们初始化一个1x7x5的三维张量,如下所示:

#encoding:utf-8
import numpy as np
import keras.backend as K
ary = np.arange(35).reshape((1, 7, 5))
inputs = K.variable(ary)
print(ary)
# result
[[[ 0  1  2  3  4][ 5  6  7  8  9][10 11 12 13 14][15 16 17 18 19][20 21 22 23 24][25 26 27 28 29][30 31 32 33 34]]]

接下来,我们将分别对该张量使用dropout和SpatialDropout1D技术。

首先,我们先对该张量测试普通的dropout,其中dropout_rate为0.5:

dropout_1 = K.eval(K.dropout(inputs, level=0.5))
print(dropout_1)
# result
[[[ 0.  2.  4.  6.  8.][ 0.  0. 14. 16. 18.][ 0.  0. 24.  0. 28.][ 0. 32. 34.  0.  0.][40.  0.  0.  0. 48.][ 0. 52.  0. 56.  0.][ 0. 62. 64.  0.  0.]]]

从结果中,我们可以看到普通的dropout随机地将部分元素置零,并且是无规律的,也就是说下次可能是另外一部分元素置零。

接下来,然后我们对该张量测试SpatialDropout1D,要达到SpatialDropout1D的效果。我们需要指定dropout的shape,对应dropout函数中的参数noise_shape。

noise_shape是一个一维张量,说白了就是一个一维数组,长度必须跟inputs.shape一样,而且,noise_shape的元素,只能是1或者inputs.shape里面对应的元素。比如inputs.shape= (3,4,5)
,那么noise_shape就只能是以下8种情况:

(3,4,5),(1,4,5),(3,1,5),(3,4,1),(1,1,5),(1,4,1),(3,1,1,),(1,1,1)

实际上,哪个轴为1,哪个轴就会被一致的dropout,比如(3,4,5)是就是普通的dropout,没有任何约束

因此,从上图中,我们想要实现SpatialDropout1D,noise_shape应为(input_shape[0], 1, input_shape[2]),即:

input_shape=K.shape(inputs)
noise_shape=(input_shape[0], 1, input_shape[2])
dropout_2 = K.eval(K.dropout(inputs, 0.5, noise_shape))
print(dropout_2)
# result
[[[ 0.  2.  0.  6.  8.][ 0. 12.  0. 16. 18.][ 0. 22.  0. 26. 28.][ 0. 32.  0. 36. 38.][ 0. 42.  0. 46. 48.][ 0. 52.  0. 56. 58.][ 0. 62.  0. 66. 68.]]]

可以看到,与普通的dropout不同的是,SpatialDropout1D随机地将某块区域全部置零。

实际上,我们也可以横向将部分区域全部置零,只需修改noise_shape即可,即:

noise_shape = (input_shape[0], input_shape[1], 1)
dropout_3 = K.eval(K.dropout(inputs, 0.5, noise_shape))
print(dropout_3)
# result
[[[ 0.  2.  4.  6.  8.][ 0.  0.  0.  0.  0.][20. 22. 24. 26. 28.][ 0.  0.  0.  0.  0.][40. 42. 44. 46. 48.][50. 52. 54. 56. 58.][60. 62. 64. 66. 68.]]]

所以,通过修改noise_shape,本质上我们可以实现任意功能的dropout。

在keras模块中,一般我们实现一个新的dropout,会按照下列模板进行,比如;

class TimestepDropout(Dropout):def __init__(self, rate, **kwargs):super(TimestepDropout, self).__init__(rate, **kwargs)self.input_spec = InputSpec(ndim=3)def _get_noise_shape(self, inputs):input_shape = K.shape(inputs)noise_shape = (input_shape[0], input_shape[1], 1)return noise_shape

:本质上是修改noise_shape,新类TimestepDropout继承了Dropout,我们知道当子类中存在与父类相同的函数时,子类的函数会更新父类函数。所以本质上就是修改获取noise_shape的函数。

备注:最近刚开始学习pytorch

pytorch

import torch.nn as nn
from itertools import repeat
class Spatial_Dropout(nn.Module):def __init__(self,drop_prob):super(Spatial_Dropout,self).__init__()self.drop_prob = drop_probdef forward(self,inputs):output = inputs.clone()if not self.training or self.drop_prob == 0:return inputselse:noise = self._make_noise(inputs)if self.drop_prob == 1:noise.fill_(0)else:noise.bernoulli_(1 - self.drop_prob).div_(1 - self.drop_prob)noise = noise.expand_as(inputs)output.mul_(noise)return outputdef _make_noise(self,input):return input.new().resize_(input.size(0),*repeat(1, input.dim() - 2),input.size(2))

Spatial Dropout相关推荐

  1. 深度学习Dropout技术分析

    深度学习Dropout技术分析 什么是Dropout? dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃.注意是暂时,对于随机梯度下降来说,由于是随机 ...

  2. 12种主要的Dropout方法:用于DNNs,CNNs,RNNs中的数学和可视化解释

    深入了解DNNs,CNNs以及RNNs中的Dropout来进行正则化,蒙特卡洛不确定性和模型压缩的方法. 动机 在深度机器学习中训练一个模型的主要挑战之一是协同适应.这意味着神经元是相互依赖的.他们对 ...

  3. Dropout 的前世与今生

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 Dropout 是一类用于神经网络训练或推理的随机化技术,这类技术 ...

  4. 在神经网络中使用dropout

    一.什么是dropout dropout是解决神经网络模型过拟合的好办法,那什么是dropout呢?简而言之,它就是随机的将输入的张量中元素置为0,dropout可以理解为一种集成模型.因为我们将元素 ...

  5. 12种Dropout方法:应用于DNNs,CNNs,RNNs中的数学和可视化解释

    2020-06-30 13:41:41 作者:Axel Thevenot 编译:ronghuaiyang 导读 深入了解DNNs,CNNs以及RNNs中的Dropout来进行正则化,蒙特卡洛不确定性和 ...

  6. dropout层_DNN,CNN和RNN的12种主要dropout方法的数学和视觉解释

    深入研究DNN,CNN和RNNDropout方法以进行正则化,蒙特卡洛不确定性和模型压缩 动机 在(深度)机器学习中训练模型时的主要挑战之一是协同适应. 这意味着神经元彼此非常依赖. 它们彼此之间影响 ...

  7. Dropout的前世与今生

    选自arXiv 作者:Alex Labach等 机器之心编译 参与:Geek AI.张倩 Dropout 是一类用于神经网络训练或推理的随机化技术,这类技术已经引起了研究者们的广泛兴趣,并且被广泛地应 ...

  8. 神经网络中的 Dropout 以及变体方法

    Dropout 的学习笔记,主要参考文章: 12种主要的Dropout方法:如何应用于DNNs,CNNs,RNNs中的数学和可视化解释 [科普]神经网络中的随机失活方法 1. 简介 深度学习训练模型的 ...

  9. 【Keras】减少过拟合的秘诀——Dropout正则化

    摘要: Dropout正则化是最简单的神经网络正则化方法.阅读完本文,你就学会了在Keras框架中,如何将深度学习神经网络Dropout正则化添加到深度学习神经网络模型里. Dropout正则化是最简 ...

  10. Keras中Dropout的用法详解

    本文借鉴整理三篇文章,比较全面的用法总结了,看完本文无需再查阅其他资料 一.Keras 中使用 Dropout 正则化减少过度拟合 Dropout正则化是最简单的神经网络正则化方法.其原理非常简单粗暴 ...

最新文章

  1. 微信支付:“当前页面的URL未注册”
  2. python3 RSA加解密
  3. 一个关于nvarchar字段排序,中英文混合排序的问题
  4. educational round 前缀和_总结分析634个以re为前缀的单词得出了re为前缀组合单词意思规律
  5. 计算机控制实验教程,新)《计算机控制技术》实验教程.doc
  6. Halcon 和 C# 联合编程 - 如何使用开源项目 ViewROI
  7. 计算机与工程建设项目结合,计算机科学与技术在工程建设项目管理中应用.doc...
  8. 谁都会做:简单易行的祛斑法 - 健康程序员,至尚生活!
  9. Save our Scrum作者访谈
  10. SQLServer中在视图上使用索引(转载)
  11. 谷歌开放语音识别 API,发力人工智能
  12. FluentAPI --- 用C#写的JS代码生成器
  13. visual fortran常用数值算法集_资深游戏数值策划自白:数值不是你想象的那么简单!...
  14. asp:树型select菜单
  15. jboss 服务器配置文件,Apache jboss 集群详细配置
  16. java docx4j 使用教程_使用Docx4j操作PPT指南系列(二)
  17. 三诺+n20g+微型计算机,岁月留声 三诺15周年经典回顾
  18. 如何使用视频压缩软件,压缩视频大小 ?
  19. BP神经网络原理简单介绍以及公式推导(矩阵形式和分量形式)
  20. 再见Spring Security、推荐一款功能强大的权限认证框架

热门文章

  1. HTML5期末大作业:游戏设计网站设计——游戏介绍(5页) 大学生游戏网页设计作业模板下载 网游网页设计作业成品 静态HTML手游网页制作下载_网页设计代码
  2. 038 罗尔定理及拉格朗日定理
  3. nic占用率很高 Linux,linux – 许多丢弃了我的NIC数据包
  4. Mplayer SMplayer 软件配置
  5. 使用阿里云的身份证实名认证接口
  6. cccc2016决赛9
  7. Vue上传多张图片到服务器,数据库存储图片路径并将图片渲染到前端
  8. 少说话多写代码之Python学习022——赋值语句01(序列解包)
  9. Stata | 时间序列操作
  10. 错误记录-java idea执行k8s https api报错 should not be presented in certificate_request