神经网络之卷积篇:详解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 ...
随机推荐
- Atcoder Beginner Contest 324 G Generate Arrays 题解-Treap
为了更好的阅读体验,请点击这里 题目链接 套上平衡树板子就能做的很快的题,然后因为是指针存树,因此交换只需要把序列大小较小的挨个拿出来插到相应的地方即可.复杂度 \(O(N \log^2 N)\). ...
- python调用微信JS_SDK及使用redis缓存access_token 和jsapi_ticket
from flask import Flask, make_response,request import json import string import hashlib import rando ...
- 高通与At指令:基础概念
背景 在某个新基线上移植AT指令,发现有问题,因此收集了这个系列的 文章 作为 这方面的知识补充. 原文作者:laozhuxinlu,本文有删改. AT指令在产线中是一类比较重要的问题, 一天没来得及 ...
- Unicode 和JS中的字符串
计算机内部使用二进制存储数据,只认识0和1两个数字,计算机的世界只有0和1.但我们的世界却充满着文字,如a, b, c.怎样才能让计算机显示文字,供我们使用和交流?只能先把文字转化成数字进行存储,然后 ...
- .Net Core WebApi 使用 JWT 验证身份
.h2 { background-color: rgba(78, 110, 242, 1); color: rgba(255, 255, 255, 1); padding: 10px } 一.注册身份 ...
- windows server + iis 部署若伊前端vue项目
一.背景说明 工作原因,一直使用若伊前后端分离版框架进行二次开发.客户的服务器多数为windows server系统,少部分为linux系统.过去一直是使用nginx进行前端的部署,nginx的代理功 ...
- 【Playwright+Python】系列教程(四)Pytest 插件在Playwright中的使用
一.命令行使用详解 使用Pytest插件在Playwright 中来编写端到端的测试. 1.命令行执行测试 pytest --browser webkit --headed 2.使用 pytest.i ...
- SpringBoot集成Mongodb文档数据库
添加Maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...
- Asp .Net Core 系列:基于 T4 模板生成代码
目录 简介 组成部分 分类 Visual Studio 中使用T4模板 创建T4模板文件 2. 编写T4模板 3. 转换模板 中心控制Manager 根据 MySQL 数据生成 实体 简介 T4模板, ...
- Java JVM——12. 垃圾回收理论概述
1.前言 1.1 什么是垃圾? 在提到什么是垃圾之前,我们先看下面一张图: 从上图我们可以很明确的知道,Java 和 C++ 语言的区别,就在于垃圾收集技术和内存动态分配上,C++ 语言没有垃圾收集技 ...