神经网络之卷积篇:详解Padding
详解Padding
为了构建深度神经网络,需要学会使用的一个基本的卷积操作就是padding,让来看看它是如何工作的。

如果用一个3×3的过滤器卷积一个6×6的图像,最后会得到一个4×4的输出,也就是一个4×4矩阵。那是因为3×3过滤器在6×6矩阵中,只可能有4×4种可能的位置。这背后的数学解释是,如果有一个\(n×n\)的图像,用\(f×f\)的过滤器做卷积,那么输出的维度就是\((n-f+1)×(n-f+1)\)。在这个例子里是\(6-3+1=4\),因此得到了一个4×4的输出。
这样的话会有两个缺点,第一个缺点是每次做卷积操作,图像就会缩小,从6×6缩小到4×4,可能做了几次之后,图像就会变得很小了,可能会缩小到只有1×1的大小。可不想让图像在每次识别边缘或其他特征时都缩小,这就是第一个缺点。

第二个缺点时,如果注意角落边缘的像素,这个像素点(绿色阴影标记)只被一个输出所触碰或者使用,因为它位于这个3×3的区域的一角。但如果是在中间的像素点,比如这个(红色方框标记),就会有许多3×3的区域与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着丢掉了图像边缘位置的许多信息。

为了解决这两个问题,一是输出缩小。当建立深度神经网络时,就会知道为什么不希望每进行一步操作图像都会缩小。比如当有100层深层的网络,如果图像每经过一层都缩小的话,经过100层网络后,就会得到一个很小的图像,所以这是个问题。另一个问题是图像边缘的大部分信息都丢失了。

为了解决这些问题,可以在卷积操作之前填充这幅图像。在这个案例中,可以沿着图像边缘再填充一层像素。如果这样操作了,那么6×6的图像就被填充成了一个8×8的图像。如果用3×3的图像对这个8×8的图像卷积,得到的输出就不是4×4的,而是6×6的图像,就得到了一个尺寸和原始图像6×6的图像。习惯上,可以用0去填充,如果\(p\)是填充的数量,在这个案例中,\(p=1\),因为在周围都填充了一个像素点,输出也就变成了\((n+2p-f+1)×(n+2p-f+1)\),所以就变成了\((6+2×1-3+1)×(6+2×1-3+1)=6×6\),和输入的图像一样大。这个涂绿的像素点(左边矩阵)影响了输出中的这些格子(右边矩阵)。这样一来,丢失信息或者更准确来说角落或图像边缘的信息发挥的作用较小的这一缺点就被削弱了。
刚才已经展示过用一个像素点来填充边缘,如果想的话,也可以填充两个像素点,也就是说在这里填充一层。实际上还可以填充更多像素。这里画的这种情况,填充后\(p=2\)。

至于选择填充多少像素,通常有两个选择,分别叫做Valid卷积和Same卷积。
Valid卷积意味着不填充,这样的话,如果有一个\(n×n\)的图像,用一个\(f×f\)的过滤器卷积,它将会给一个\((n-f+1)×(n-f+1)\)维的输出。这类似于在前面的例子,有一个6×6的图像,通过一个3×3的过滤器,得到一个4×4的输出。

另一个经常被用到的填充方法叫做Same卷积,那意味填充后,输出大小和输入大小是一样的。根据这个公式\(n-f+1\),当填充\(p\)个像素点,\(n\)就变成了\(n+2p\),最后公式变为\(n+2p-f+1\)。因此如果有一个\(n×n\)的图像,用\(p\)个像素填充边缘,输出的大小就是这样的\((n+2p-f+1)×(n+2p-f+1)\)。如果想让\(n+2p-f+1=n\)的话,使得输出和输入大小相等,如果用这个等式求解\(p\),那么\(p=(f-1)/2\)。所以当\(f\)是一个奇数的时候,只要选择相应的填充尺寸,就能确保得到和输入相同尺寸的输出。这也是为什么前面的例子,当过滤器是3×3时,使得输出尺寸等于输入尺寸,所需要的填充是(3-1)/2,也就是1个像素。另一个例子,当过滤器是5×5,如果\(f=5\),然后代入那个式子,就会发现需要2层填充使得输出和输入一样大,这是过滤器5×5的情况。

习惯上,计算机视觉中,\(f\)通常是奇数,甚至可能都是这样。很少看到一个偶数的过滤器在计算机视觉里使用,认为有两个原因。
其中一个可能是,如果\(f\)是一个偶数,那么只能使用一些不对称填充。只有\(f\)是奇数的情况下,Same卷积才会有自然的填充,可以以同样的数量填充四周,而不是左边填充多一点,右边填充少一点,这样不对称的填充。
第二个原因是当有一个奇数维过滤器,比如3×3或者5×5的,它就有一个中心点。有时在计算机视觉里,如果有一个中心像素点会更方便,便于指出过滤器的位置。
也许这些都不是为什么\(f\)通常是奇数的充分原因,但如果看了卷积的文献,经常会看到3×3的过滤器,也可能会看到一些5×5,7×7的过滤器。后面也会谈到1×1的过滤器,以及什么时候它是有意义的。但是习惯上,推荐只使用奇数的过滤器。想如果使用偶数f也可能会得到不错的表现,如果遵循计算机视觉的惯例,通常使用奇数值的\(f\)。
已经看到如何使用padding卷积,为了指定卷积操作中的padding,可以指定\(p\)的值。也可以使用Valid卷积,也就是\(p=0\)。也可使用Same卷积填充像素,使输出和输入大小相同。
神经网络之卷积篇:详解Padding的更多相关文章
- PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
PHP函数篇详解十进制.二进制.八进制和十六进制转换函数说明 作者: 字体:[增加 减小] 类型:转载 中文字符编码研究系列第一期,PHP函数篇详解十进制.二进制.八进制和十六进制互相转换函数说明 ...
- 走向DBA[MSSQL篇] 详解游标
原文:走向DBA[MSSQL篇] 详解游标 前篇回顾:上一篇虫子介绍了一些不常用的数据过滤方式,本篇详细介绍下游标. 概念 简单点说游标的作用就是存储一个结果集,并根据语法将这个结果集的数据逐条处理. ...
- 基于双向BiLstm神经网络的中文分词详解及源码
基于双向BiLstm神经网络的中文分词详解及源码 基于双向BiLstm神经网络的中文分词详解及源码 1 标注序列 2 训练网络 3 Viterbi算法求解最优路径 4 keras代码讲解 最后 源代码 ...
- Scala进阶之路-Scala函数篇详解
Scala进阶之路-Scala函数篇详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传值调用和传名调用 /* @author :yinzhengjie Blog:http: ...
- 第十五节,卷积神经网络之AlexNet网络详解(五)
原文 ImageNet Classification with Deep ConvolutionalNeural Networks 下载地址:http://papers.nips.cc/paper/4 ...
- Deeplearning 两层cnn卷积网络详解
https://blog.csdn.net/u013203733/article/details/79074452 转载地址: https://www.cnblogs.com/sunshineatno ...
- 神经网络基础部件-BN层详解
一,数学基础 1.1,概率密度函数 1.2,正态分布 二,背景 2.1,如何理解 Internal Covariate Shift 2.2,Internal Covariate Shift 带来的问题 ...
- CentOS 7 下编译安装lnmp之PHP篇详解
一.安装环境 宿主机=> win7,虚拟机 centos => 系统版本:centos-release-7-5.1804.el7.centos.x86_64 二.PHP下载 官网 http ...
- CentOS 7 下编译安装lnmp之MySQL篇详解
一.安装环境 宿主机=> win7,虚拟机 centos => 系统版本:centos-release-7-5.1804.el7.centos.x86_64 二.MySQL下载 MySQL ...
- CentOS 7 下编译安装lnmp之nginx篇详解
一.安装环境 宿主机=> win7,虚拟机 centos => 系统版本:CentOS Linux release 7.5.1804 (Core),ip地址 192.168.1.168 ...
随机推荐
- WPF/C#:BusinessLayerValidation
BusinessLayerValidation介绍 BusinessLayerValidation,即业务层验证,是指在软件应用程序的业务逻辑层(Business Layer)中执行的验证过程.业务逻 ...
- Prometheus监控系统(一)Prometheus介绍
1. Prometheus简介 Prometheus受启发于Google的Brogmon监控系统(类似kubernetes是从Google的Brog系统演变而来).于2012年以开源形式发布,在201 ...
- QT学习:09 QByteArray
--- title: framework-cpp-qt-09-QByteArray EntryName: framework-cpp-qt-09-QByteArray date: 2020-04-16 ...
- TOPSIS模型原理以及代码实现
TOPSIS 法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距.下面我们来介绍具体步骤与代码实现 目录 问题提出 第一步:数据输入 1.如何从excel ...
- yb课堂 首页home开发 《三十七》
Home模块开发 拆分子组件 Home banner videoList 指令属性里面取data里面的数据不用加{{}},html标签内容体中间则需要加双花括号 创建component文件夹 在src ...
- 洛谷P1365
WJMZBMR打osu! / Easy 题目背景 原 维护队列 参见 P1903 题目描述 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有 ...
- [oeasy]python017_万行代码之梦_vim环境_复制粘贴
继续运行 回忆上次内容 上次 保存运行一条龙 :w|!python3 % 我想 再多输出 几行 增加一下 代码量 可以吗? 添加图片注释,不超过 140 字(可选) 代码量 在正常模式 ...
- C#:进程之间传递数据
一.思路 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.常用的方法有 使用内存映射文件 通过共享内存DLL共享内存 使用SendMessage向另一进程发送WM_COPYDATA ...
- C# EF Core 后端代码已定义的用户实体,如何扩展字段?
注:"2020中国.NET开发者大会"上学习到的开发技巧, 记录下来 1.问题 后端代码已定义的用户实体,如下: public class UserEntity { public ...
- python 列表append和 的区别??
python列表中的合并 python列表中append方法是给列表增加一个元素,而'+='是增加上该符号后边的元素,类似于extend方法 不知道对错,先记下来.我学的append方法是在列表最后追 ...