caffe详解之Dropout层
时间:2022-07-22
本文章向大家介绍caffe详解之Dropout层,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
从零开始,一步一步学习caffe的使用,期间贯穿深度学习和调参的相关知识!
Dropout 参数设置
Dropout
是一个防止过拟合的层,只需要设置一个dropout_ratio
就可以了。
layer {
name: "drop7"
type: "Dropout"
bottom: "fc7-conv"
top: "fc7-conv"
dropout_param {
dropout_ratio: 0.5
}
}
Dropout 实现代码
def dropout(X, drop_probability):
keep_probability = 1 - drop_probability
assert 0 <= keep_probability <= 1
# 这种情况下把全部元素都丢弃。
if keep_probability == 0:
return X.zeros_like()
# 随机选择一部分该层的输出作为丢弃元素。
mask = nd.random.uniform(
0, 1.0, X.shape, ctx=X.context) < keep_probability
# 保证 E[dropout(X)] == X
scale = 1 / keep_probability
return mask * X * scale
Dropout 意义
Dropout可以被认为是集成大量深层神经网络的实用Bagging方法。但是Bagging方法涉及训练多个模型,并且在每个测试样本上评估多个模型。当每个模型都是一个大型神经网络时,Bagging方法会耗费很多的时间和内存。而Dropout则提供了一种廉价的Bagging集成近似,能够训练和评估指数级数量的神经网络。
- Dropout训练的集成包括所有从基础网络中除去神经元(非输出单元)后形成的子网络。只需将一些单元的输出乘零就能有效的删除一个单元(称之为乘零的简单Dropout算法)。假如基本网络有n个非输出神经元,则一共有2^n个子网络。
- Dropout的目标是在指数级数量的神经网络上近似Bagging过程。具体来说,在训练中使用Dropout时,我们会使用基于小批量产生较小步长的学习算法,如随机梯度下降。
- 每次在小批量中加载一个样本,然后随机抽样(用于网络中所有输入和隐藏单元的)不同二值掩码。
- 对于每个单元,掩码是独立采样的。通常输入单元被包括的概率为0.8,隐藏单元被包括的概率为0.5。
- 然后与之前一样,运行前向传播、反向传播和学习更新。
Dropout 小结
Dropout优点
- 计算方便。训练过程中使用Dropout产生n个随机二进制数与状态相乘即可。每个样本每次更新的时间复杂度:O(n),空间复杂度:O(n)。
- 适用广。Dropout不怎么限制适用的模型或训练过程,几乎在所有使用分布式表示且可以用随机梯度下降训练的模型上都表现很好。包括:前馈神经网络、概率模型、受限波尔兹曼机、循环神经网络等。
- 相比其他正则化方法(如权重衰减、过滤器约束和稀疏激活)更有效。也可与其他形式的正则化合并,得到进一步提升。
Dropout缺点
- 不适合宽度太窄的网络。否则大部分网络没有输入到输出的路径。
- 不适合训练数据太小(如小于5000)的网络。训练数据太小时,Dropout没有其他方法表现好。
- 不适合非常大的数据集。数据集大的时候正则化效果有限(大数据集本身的泛化误差就很小),使用Dropout的代价可能超过正则化的好处。
Dropout衍生方法
- Dropout作用于线性回归时,相当于每个输入特征具有不同权重衰减系数的L^2权重衰减,系数大小由其方差决定。但对深度模型而言,二者是不等同的。
- 快速Dropout (Wang and Manning,2013):利用近似解的方法,减小梯度计算中的随机性析解,获得更快的收敛速度。
- DropConnect (Wan,2013):将一个标量权重和单个隐藏单元状态之间的每个乘积作为可以丢弃的一个单元。
- u不取二值,而是服从正态分布,即
参考
Deep Learning Book 深度学习中的正则化(https://github.com/exacity/simplified-deeplearning/)
- JDBC基础入门(2)
- 11g备库无法开启ADG的原因分析 (r7笔记第62天)
- JDBC基础入门(3)
- Python多元线性回归-sklearn.linear_model,并对其预测结果评估
- python 聚类分析实战案例:K-means算法(原理源码)
- JAVA面试题解惑——final、finally和finalize的区别
- Java内存管理
- python基础知识——内置数据结构(字典)
- mysql、mongodb、python(dataframe).聚合函数的形式,以及报错解决方案
- JavaScript计算水仙花数【可自定义范围】
- JSP简单入门(1)
- mongodb取出json,利用python转成dataframe(dict-to-dataframe)
- JSP简单入门(2)
- JSP简单入门(3)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spock测试框架实践(三)
- aof数据的恢复和rdb数据在不同服务器之间的迁移
- redis的sort命令详解
- 推荐系统基础:使用PyTorch进行矩阵分解进行动漫的推荐
- go语言TCP编程入门
- 聊聊claudb的NotificationManager
- PowerBI RFM 4.0 - 第一篇 - 滚动连续评估法-业务解释
- [梁山好汉说IT] 如何理解脑裂问题
- DNS原理和CentOS7上bind域名服务器配置详解
- 前沿测试平台之mock接口实现及应用
- mysql远程连接错误。1044 解决
- 通过JSONP实现跨域访问
- Java编写http请求发送Json报文案例
- 详解 mysql int 类型的长度值问题
- 常见排序算法及golang 实现