Spatial Dropout
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具体做了啥,如下图所示:
![](https://lonepatient-1257945978.cos.ap-chengdu.myqcloud.com/20181115230804.png)
首先,让我们看看SpatialDropout1D的输入和输出。SpatialDropout1D的输入是三维张量(samples,timesteps,channels),输出的纬度与输入的纬度相同。
我们以文本为例,一个文本的三维张量可以表示为(samples,sequence_length,embedding_dim),其中:
- sequence_length表示句子的长度
- embedding_dim表示词向量的纬度
如下图所示:
![](https://lonepatient-1257945978.cos.ap-chengdu.myqcloud.com/20181115231537.png)
当我们对该张量使用dropout技术时,你会发现普通的dropout会随机独立地将部分元素置零,而SpatialDropout1D会随机地对某个特定的纬度全部置零,如下图所示:
![](https://lonepatient-1257945978.cos.ap-chengdu.myqcloud.com/20181115231816.png)
接下来,我们简单的以一个简单的案例说明,首先,我们初始化一个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相关推荐
- 深度学习Dropout技术分析
深度学习Dropout技术分析 什么是Dropout? dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃.注意是暂时,对于随机梯度下降来说,由于是随机 ...
- 12种主要的Dropout方法:用于DNNs,CNNs,RNNs中的数学和可视化解释
深入了解DNNs,CNNs以及RNNs中的Dropout来进行正则化,蒙特卡洛不确定性和模型压缩的方法. 动机 在深度机器学习中训练一个模型的主要挑战之一是协同适应.这意味着神经元是相互依赖的.他们对 ...
- Dropout 的前世与今生
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 Dropout 是一类用于神经网络训练或推理的随机化技术,这类技术 ...
- 在神经网络中使用dropout
一.什么是dropout dropout是解决神经网络模型过拟合的好办法,那什么是dropout呢?简而言之,它就是随机的将输入的张量中元素置为0,dropout可以理解为一种集成模型.因为我们将元素 ...
- 12种Dropout方法:应用于DNNs,CNNs,RNNs中的数学和可视化解释
2020-06-30 13:41:41 作者:Axel Thevenot 编译:ronghuaiyang 导读 深入了解DNNs,CNNs以及RNNs中的Dropout来进行正则化,蒙特卡洛不确定性和 ...
- dropout层_DNN,CNN和RNN的12种主要dropout方法的数学和视觉解释
深入研究DNN,CNN和RNNDropout方法以进行正则化,蒙特卡洛不确定性和模型压缩 动机 在(深度)机器学习中训练模型时的主要挑战之一是协同适应. 这意味着神经元彼此非常依赖. 它们彼此之间影响 ...
- Dropout的前世与今生
选自arXiv 作者:Alex Labach等 机器之心编译 参与:Geek AI.张倩 Dropout 是一类用于神经网络训练或推理的随机化技术,这类技术已经引起了研究者们的广泛兴趣,并且被广泛地应 ...
- 神经网络中的 Dropout 以及变体方法
Dropout 的学习笔记,主要参考文章: 12种主要的Dropout方法:如何应用于DNNs,CNNs,RNNs中的数学和可视化解释 [科普]神经网络中的随机失活方法 1. 简介 深度学习训练模型的 ...
- 【Keras】减少过拟合的秘诀——Dropout正则化
摘要: Dropout正则化是最简单的神经网络正则化方法.阅读完本文,你就学会了在Keras框架中,如何将深度学习神经网络Dropout正则化添加到深度学习神经网络模型里. Dropout正则化是最简 ...
- Keras中Dropout的用法详解
本文借鉴整理三篇文章,比较全面的用法总结了,看完本文无需再查阅其他资料 一.Keras 中使用 Dropout 正则化减少过度拟合 Dropout正则化是最简单的神经网络正则化方法.其原理非常简单粗暴 ...
最新文章
- 微信支付:“当前页面的URL未注册”
- python3 RSA加解密
- 一个关于nvarchar字段排序,中英文混合排序的问题
- educational round 前缀和_总结分析634个以re为前缀的单词得出了re为前缀组合单词意思规律
- 计算机控制实验教程,新)《计算机控制技术》实验教程.doc
- Halcon 和 C# 联合编程 - 如何使用开源项目 ViewROI
- 计算机与工程建设项目结合,计算机科学与技术在工程建设项目管理中应用.doc...
- 谁都会做:简单易行的祛斑法 - 健康程序员,至尚生活!
- Save our Scrum作者访谈
- SQLServer中在视图上使用索引(转载)
- 谷歌开放语音识别 API,发力人工智能
- FluentAPI --- 用C#写的JS代码生成器
- visual fortran常用数值算法集_资深游戏数值策划自白:数值不是你想象的那么简单!...
- asp:树型select菜单
- jboss 服务器配置文件,Apache jboss 集群详细配置
- java docx4j 使用教程_使用Docx4j操作PPT指南系列(二)
- 三诺+n20g+微型计算机,岁月留声 三诺15周年经典回顾
- 如何使用视频压缩软件,压缩视频大小 ?
- BP神经网络原理简单介绍以及公式推导(矩阵形式和分量形式)
- 再见Spring Security、推荐一款功能强大的权限认证框架
热门文章
- HTML5期末大作业:游戏设计网站设计——游戏介绍(5页) 大学生游戏网页设计作业模板下载 网游网页设计作业成品 静态HTML手游网页制作下载_网页设计代码
- 038 罗尔定理及拉格朗日定理
- nic占用率很高 Linux,linux – 许多丢弃了我的NIC数据包
- Mplayer SMplayer 软件配置
- 使用阿里云的身份证实名认证接口
- cccc2016决赛9
- Vue上传多张图片到服务器,数据库存储图片路径并将图片渲染到前端
- 少说话多写代码之Python学习022——赋值语句01(序列解包)
- Stata | 时间序列操作
- 错误记录-java idea执行k8s https api报错 should not be presented in certificate_request