caffe详解之池化层
从零开始,一步一步学习caffe的使用,期间贯穿深度学习和调参的相关知识!
池化层参数说明
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX #池化方法,默认为MAX。目前可用的方法有MAX, AVE
kernel_size: 3 #池化的核大小
stride: 2 #池化的步长,默认为1。一般我们设置为2,即不重叠。
}
}
caffe池化层对应的参数说明文件,如下:
message PoolingParameter {
enum PoolMethod {
MAX = 0;
AVE = 1;
STOCHASTIC = 2;
}
optional PoolMethod pool = 1 [default = MAX]; // The pooling method
// Pad, kernel size, and stride are all given as a single value for equal
// dimensions in height and width or as Y, X pairs.
optional uint32 pad = 4 [default = 0]; // The padding size (equal in Y, X)
optional uint32 pad_h = 9 [default = 0]; // The padding height
optional uint32 pad_w = 10 [default = 0]; // The padding width
optional uint32 kernel_size = 2; // The kernel size (square)
optional uint32 kernel_h = 5; // The kernel height
optional uint32 kernel_w = 6; // The kernel width
optional uint32 stride = 3 [default = 1]; // The stride (equal in Y, X)
optional uint32 stride_h = 7; // The stride height
optional uint32 stride_w = 8; // The stride width
enum Engine {
DEFAULT = 0;
CAFFE = 1;
CUDNN = 2;
}
optional Engine engine = 11 [default = DEFAULT];
// If global_pooling then it will pool over the size of the bottom by doing
// kernel_h = bottom->height and kernel_w = bottom->width
optional bool global_pooling = 12 [default = false];
}
池化层详解
池化图解
- Max pooling 与 Average pooling
- Global Average pooling
池化层意义
因为卷积层每次作用在一个窗口,它对位置很敏感。池化层能够很好的缓解这个问题。它跟卷积类似每次看一个小窗口,然后选出窗口里面最大的元素,或者平均元素作为输出。这样做为后续操作减少了运算量,同时能有效避免数据过拟合的现象。
pooling
的操作如果采用global
的方式进行,也就是对输入数据的一整个面进行pool
操作,这种设计方法可以在某种情况下代替全连接层,减少参数的存储和计算量。例如SqueezeNet
最后一层,ResNet-50
倒数第二层j均采用了global
的ave-pooling
。
max-pool的问题
现在的最大池化层大约去掉了 75% 的激活函数。
- 空间信息损失:当去掉 75% 的激活函数时,关于其来源的信息就会丢失。
- 最大池化层无法使用来自多层激活函数的信息。
- 反向传播只会提升最大池化的激活函数,即使其他激活函数的值可能出现错误。
sort_pool2d
sort_pool2d
的提出旨在尽量多的解决max-pooling上面提到的问题,具体实现方式如下:
设池化之前的层的输出为张量 T,大小为 [B, H, W, C]。定义一个超参数 pool_range
,它可以是 [1,2,3,4] 中的任意一个。pool_range
指定激活函数(按照排列顺序保存)的数量。假设要被池化的张量 T 有 4 个激活函数,我首先按照 [a1, a2, a3, a4] 的顺序排列它们,其中 a1 ≥ a2 ≥ a3 ≥ a4。接着保留其中的第一个 pool_range
,我称之为激活向量。
将 pool_range
的权重向量定义为 [w{1},…. w{pool_range}]。这里需要注意的是,如果这些权重中的任何一个是负值,则激活向量按强度排序且采用加权平均的假设将不成立。因此,没有直接使用权重,而是在权重向量上取一个 softmax
,并将结果乘以激活向量。
其实sort_pool2d
是max-pooling
的一个扩展,假设pool_range=1
对应的便是max-pooling
。具体代码参考:
sort_pool2d 代码:https://github.com/singlasahil14/sortpool2d/blob/master/sortpool2d_test.py
sort_pool2d 实现:https://github.com/singlasahil14/sortpool2d/blob/master/sort_pool2d.py
参考
花式池化 https://antkillerfarm.github.io/dl/2017/08/28/Deep_Learning_13.html 新型池化层sort_pool2d实现更快更好的收敛:表现优于最大池化层 http://mp.weixin.qq.com/s/XzOri12hwyOCdI1TgGQV3w
- BZOJ 1115: [POI2009]石子游戏Kam (阶梯nim)
- php性能监测模块XHProf
- BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)
- 洛谷P2252 取石子游戏(威佐夫博弈)
- HDU 3032 Nim or not Nim?(Multi-Nim)
- POJ 2311 Cutting Game(二维SG+Multi-Nim)
- js去掉html标签和去掉字符串文本的所有的空格
- php操作memcache的使用测试总结
- linux awk命令详解
- php str_split 解决中文
- PHP汉字转拼音函数
- 51NOD 1185 威佐夫游戏 V2(威佐夫博弈)
- HDU 1527 取石子游戏(威佐夫博弈)
- PHP文件操作类
- 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 数组属性和方法
- 盘一盘 Python 特别篇 20 - SciPy 稀疏矩阵
- Spark 3.0.0-SNAPSHOT Access Kerberized HDFS
- Spark Nightly Builds
- R语言入门之基本统计量
- K8S 生态周报| Istio 已修复导致 Pod 崩溃的 bug
- Spark Kubernetes 的源码分析系列 - submit
- 如何交互可视化 Roam Research 局部笔记网络?
- Spark Kubernetes 的源码分析系列 - features
- Spark Kubernetes 的源码分析系列 - scheduler
- 简易Ramdisk 镜像制作(基于Centos7+)
- 在 K8S 部署一个 Spark History Server - 篇1
- R语言入门之非参数假设检验
- 在 K8S 部署一个 Spark History Server - 篇2
- UEFI/LEGACY 可启动ISO制作
- Kerberized HDFS with Kubernetes