感谢吴恩达老师的公开课,以下图片均来自于吴恩达老师的公开课课件

为什么要进行卷积操作?

我们通过前几天的实验已经做了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的关系、卷积步长的更多相关文章

  1. ubuntu之路——day17.4 卷积神经网络示例

    以上是一个识别手写数字的示例 在这个示例中使用了两个卷积-池化层,三个全连接层和最后的softmax输出层 一般而言,CNN的构成就是由数个卷积层紧跟池化层再加上数个全连接层和输出层来构建网络. 在上 ...

  2. ubuntu之路——day17.2 RGB图像的卷积、多个filter的输出、单个卷积层的标记方法

    和单层图像的卷积类似,只需要对每一个filter构成的三层立方体上的每一个数字与原图像对应位置的数字相乘相加求和即可. 在这个时候可以分别设置filter的R.G.B三层,可以同时检测纵向或横向边缘, ...

  3. ubuntu之路——day17.3 简单的CNN和CNN的常用结构池化层

    来看上图的简单CNN: 从39x39x3的原始图像 不填充且步长为1的情况下经过3x3的10个filter卷积后 得到了 37x37x10的数据 不填充且步长为2的情况下经过5x5的20个filter ...

  4. ubuntu之路——day17.1 用np.pad做padding

    网上对np.pad的解释很玄乎,举的例子也不够直观,看了更晕了,对于CNN的填充请参考下面就够用了: np.pad的参数依次是目标数组,多增加的维数可以理解为一张图的前后左右增加几圈,设置为'cons ...

  5. 对抗生成网络-图像卷积-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特征图的 ...

  6. Python之路,Day17 - 分分钟做个BBS论坛

    Python之路,Day17 - 分分钟做个BBS论坛   本节内容: 项目:开发一个简单的BBS论坛 需求: 整体参考"抽屉新热榜" + "虎嗅网" 实现不同 ...

  7. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. Inception模型和Residual模型卷积操作的keras实现

    Inception模型和Residual残差模型是卷积神经网络中对卷积升级的两个操作. 一.  Inception模型(by google) 这个模型的trick是将大卷积核变成小卷积核,将多个卷积核 ...

  9. python——对图像进行卷积操作,使用多个滤波器

    线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果.做法很简单.首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像.然后,对于图像的 ...

随机推荐

  1. 【转载】C#中int.TryParse方法和int.Parse方法的异同之处

    在C#编程过程中,int.TryParse方法和int.Parse方法都可以将字符串string转换为整型int类型,但两者还是有区别,最重要的区别在于int.TryParse方法在字符串无法转换为i ...

  2. 【转载】C#中List集合使用GetRange方法获取指定索引范围内的所有值

    在C#的List集合中有时候需要获取指定索引位置范围的元素对象来组成一个新的List集合,此时就可使用到List集合的扩展方法GetRange方法,GetRange方法专门用于获取List集合指定范围 ...

  3. python基础之猜数字游戏

    #猜数字游戏 import random #impor语句导入random模块 guessor=0; print("#"*30) #输出30个”#“(”############## ...

  4. CAS 的问题

    cas这么好用,那么有没有什么问题呢?还真有 ABA问题 CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时 ...

  5. MySQL高可用架构应该考虑什么? 你认为应该如何设计?

    一.MySQL高可用架构应该考虑什么? 对业务的了解,需要考虑业务对数据库一致性要求的敏感程度,切换过程中是否有事务会丢失 对于基础设施的了解,需要了解基础设施的高可用的架构.例如 单网线,单电源等情 ...

  6. Oracle Block Cleanouts 块清除

    当用户发出提交(commit)之后,oracle是需要写出redo来保证故障时数据可以被恢复,oracle并不需要在提交时就写出变更的数据块.由于在事务需要修改数据时,必须分配ITL事务槽,必须锁定行 ...

  7. Oracle数据库插入过程中特殊符号

    -- 问题描述:(插入数据中有特殊符号)数据插入后乱码. -- 背景:客户提供部分Excel表格数据要求导入数据库.由于考虑到数据量不大所以粗略在Excel中进行了sql处理(在数据前后添加sql及对 ...

  8. Spring Boot 默认支持的并发量

    Spring Boot应用支持的最大并发量是多少? Spring Boot 能支持的最大并发量主要看其对Tomcat的设置,可以在配置文件中对其进行更改.当在配置文件中敲出max后提示值就是它的默认值 ...

  9. Linux忘记root密码,进入单用户模式,切换运行级别,切换用户

    切换用户指令 su - 用户名 当高权限用户切换到低权限用户的时候不需要密码 反之低权限切换到高权限用户需要高权限用户的密码 用exit可以退出当前用户,回到上一个用户 而且它的退出是一层一层退出的: ...

  10. oracle删除表空间和用户

    步骤一: 删除tablespace(登录对应用户删除表空间) DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES; 步骤二 ...