ubuntu之路——day17.1 卷积操作的意义、边缘检测的示例、filter与padding的关系、卷积步长
感谢吴恩达老师的公开课,以下图片均来自于吴恩达老师的公开课课件
为什么要进行卷积操作?
我们通过前几天的实验已经做了64*64大小的猫图片的识别。
在普通的神经网络上我们在输入层上输入的数据X的维数为(64*64*3, m) 假设第二层的节点数为1000,在全连接网络下,则W的维数为(1000, 64*64*3)。
这看起来是可以操作的,但是实际情况下的图片是更高清的,比如现在的手机已经动辄2400万像素。
在这种情况下让内存来处理很多W权重矩阵是不现实的,因此卷积神经网络就成为了计算机视觉领域的利器。
边缘检测的卷积示例

现在我们希望从上面的图片中提取纵向边缘特征,

现在我们有一个6x6的黑白图片矩阵,因为彩色图片是RGB三通道的,此时只有一个通道
我们使用了一个3x3的过滤器filter(有些文献中也称其为核kernel),用这个filter中的每个元素去和对应位置的原矩阵相乘相加,就得到了卷积后的4x4矩阵
比如最终结果第一行第一列的0 = 10x1+10x1+10x1+10x0+10x0+10x0-1x10-1x10-1x10
第一行第二列的30 = 10x1+10x1+10x1+10x0+10x0+10x0-0x10-0x10-0x10
从最终的卷积结果来看,左右两列均为0亮度最低,中间两列亮度高,所以纵向的边缘就被检测出来了。
可能从上述例子中感觉检测出的纵轴很宽,但是这只是6x6图片的卷积,如果换成维度很高像素很高的图片,就会显得很窄。
filter:
在过去,人们常常使用一些手写的过滤器来检测图像的垂直或平行边缘,比如以下的滤波器:


但是现在我们往往将滤波器中的九个参数设置为神经网络中可学习的W1~W9参数,来让神经网络自己找到更加复杂的边缘检测方式。具体的做法会在下一次博文中谈到。
Padding:
在上述的普通卷积操作中:
如果我们把原始图片看做n x n的,设置一个f x f的filter,我们会得到一个经过卷积后的(n - f + 1) x (n - f + 1)的图像,所以可以看到图像经过卷积后会变小
所以普通的卷积操作有两个缺点:
1.缩小输出shrinking output
2.丢失边缘信息 因为卷积操作的边缘只会被覆盖一次,而中间的区域会被多次卷积输出,所以边缘的信息可能会被丢掉
为了解决上述问题,我们可以在卷积操作前pad填充图像
举个例子:原始图像是6x6的,我们在周围填充一圈像素点,就变成了8x8的,然后经过3x3的卷积,得到了一个6x6的图像,和原图像的维度相同。
将填充padding的层数设为p,则经过填充后的结果就是(n + 2p - f + 1) x (n + 2p - f + 1)
Valid convolution and Same convolution:
valid:no padding
Same:Pad so that output size is the same as the input size
对于same卷积而言:n + 2p - f + 1 == n
所以得到:p = (f - 1) / 2,选用相应于filter的填充层数p就可以完成same卷积
注意:遵循计算机视觉的惯例一般的f为奇数,如3x3,5x5,7x7等,有时也会有1x1的过滤器
卷积步长stride:
所谓卷积步长就是一次将filter移动的步长,在上面的例子中,我们6x6图像的卷积中将3x3的filter每次移动1个步长,所以得到了4x4的卷积结果。
如果将步长设置为2,我们就会得到2x2的卷积结果,因为向下取整舍弃了没有卷积的部分,综合而言有以下公式:
python中:向下取整为floor,向上取整为ceil,四舍五入为round

镜像翻转:
在信号学和数学领域,通常对我们上面的操作称之为cross-correlation互相关。
对filter进行顺时针旋转180°,再进行镜像的操作后才称之为卷积。这是为了满足(A*B)*C = A*(B*C)
但是在深度学习领域中,镜像翻转的操作其实并不重要,所以在一些深度学习的文献中将第一种操作直接称之为convolution卷积。


如上图,实际上分为两步:
1.顺时针旋转180°
2.镜像翻转得到右图
ubuntu之路——day17.1 卷积操作的意义、边缘检测的示例、filter与padding的关系、卷积步长的更多相关文章
- ubuntu之路——day17.4 卷积神经网络示例
以上是一个识别手写数字的示例 在这个示例中使用了两个卷积-池化层,三个全连接层和最后的softmax输出层 一般而言,CNN的构成就是由数个卷积层紧跟池化层再加上数个全连接层和输出层来构建网络. 在上 ...
- ubuntu之路——day17.2 RGB图像的卷积、多个filter的输出、单个卷积层的标记方法
和单层图像的卷积类似,只需要对每一个filter构成的三层立方体上的每一个数字与原图像对应位置的数字相乘相加求和即可. 在这个时候可以分别设置filter的R.G.B三层,可以同时检测纵向或横向边缘, ...
- ubuntu之路——day17.3 简单的CNN和CNN的常用结构池化层
来看上图的简单CNN: 从39x39x3的原始图像 不填充且步长为1的情况下经过3x3的10个filter卷积后 得到了 37x37x10的数据 不填充且步长为2的情况下经过5x5的20个filter ...
- ubuntu之路——day17.1 用np.pad做padding
网上对np.pad的解释很玄乎,举的例子也不够直观,看了更晕了,对于CNN的填充请参考下面就够用了: np.pad的参数依次是目标数组,多增加的维数可以理解为一张图的前后左右增加几圈,设置为'cons ...
- 对抗生成网络-图像卷积-mnist数据生成(代码) 1.tf.layers.conv2d(卷积操作) 2.tf.layers.conv2d_transpose(反卷积操作) 3.tf.layers.batch_normalize(归一化操作) 4.tf.maximum(用于lrelu) 5.tf.train_variable(训练中所有参数) 6.np.random.uniform(生成正态数据
1. tf.layers.conv2d(input, filter, kernel_size, stride, padding) # 进行卷积操作 参数说明:input输入数据, filter特征图的 ...
- Python之路,Day17 - 分分钟做个BBS论坛
Python之路,Day17 - 分分钟做个BBS论坛 本节内容: 项目:开发一个简单的BBS论坛 需求: 整体参考"抽屉新热榜" + "虎嗅网" 实现不同 ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Inception模型和Residual模型卷积操作的keras实现
Inception模型和Residual残差模型是卷积神经网络中对卷积升级的两个操作. 一. Inception模型(by google) 这个模型的trick是将大卷积核变成小卷积核,将多个卷积核 ...
- python——对图像进行卷积操作,使用多个滤波器
线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果.做法很简单.首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像.然后,对于图像的 ...
随机推荐
- 利用onMouseOver和onMouseOut实现图像翻滚
代码: <img src="images/001.jpg" alt="pic" onmouseover="this.src='images/00 ...
- JavaScript之原型、函数、实例
JavaScript 函数语法 函数就是包裹在花括号中的代码块,前面使用了关键词 function: function functionname() { // 执行代码 } 当调用该函数时,会执 ...
- 基于MUI框架+HTML5PLUS 开发 iOS和Android 应用程序(APP)
目录 事前准备 创建项目 利用MUI写一个简单的页面 关于文件打包 事前准备 # 软件 HBuilder X Web开发IDE 下载地址:https://www.dcloud.io/hbuilderx ...
- window.requestAnimationFrame()的使用,处理更流畅的动画效果
https://blog.csdn.net/w2765006513/article/details/53843169 window.requestAnimationFrame()的使用 2016年12 ...
- C#与.net 入门
C# 语言和 .NET Framework 介绍 https://docs.microsoft.com/zh-cn/dotnet/csharp/getting-started/introduction ...
- Navicat链接数据库报错1130解决方案
1.背景 使用localhost 可以正常连接mysql服务器,但是使用ip地址连接保存如下: 2.问题原因 默认情况下root用户只允许本机访问,即使用localhost访问,如下图: 解决方案:将 ...
- Java开发环境之IntelliJ IDEA
查看更多Java开发环境配置,请点击<Java开发环境配置大全> 贰章:IntelliJ IDEA安装教程 1)去官网下载IDEA安装包 https://www.jetbrains.com ...
- 使用focusky制作展示动画
一个协会要举办大会议,以前我帮着做了个图片视频,就是很多照片循环展示,配个背景音乐那种. 现在又找到我,我用focusky制作下,因很久不用,怎么使用也忘了,这个软件的操作逻辑也不太容易搞的清,主要是 ...
- shell输出文本颜色
绿地白字 echo -e "\033[42;37m 绿底白字 \033[0m"
- 详解shell脚本括号区别--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]
概述 很多时候我们在写shell脚本的时候总会碰到不同的括号,那么这些不同的括号有什么区别呢? $() 用于命令交换 说明:平时脚本用的``符号也是用于命令交换的哦,和$() 的操作是一样的 ${ } ...