卷积神经网络

技交部 潘震宇

一、计算机视觉

在计算机视觉领域中,存在着许多问题,各类领域基本都包含着这俩种基础问题:

1、 图像分类

2、 目标检测

除上述之外,最近有一种新颖的技术,也出现在大众的面前——风格迁移。

那么,为什么我们学习卷积神经网络,为什么要提及计算机视觉呢?卷积神经网络又有什么用呢?我们可以参考一个例子来说明:

如上图所示,这是一张常见的猫咪图片,大小为64 * 64,实际上图片规格应该是64 * 64 * 3,因为它还存在着RGB三种值,整体来看,特征值就应该有64 * 64 * 3 = 12288个。

那当我们在进行图像分类时,就会在神经网络种,输入层就至少需要12288个单元,而假设第一层有10个单元,那么对应的权重就一共有122880个,对应的偏移量也会有122880个。这也意味着我们在迭代的过程中每次都会牵扯到这么多的数值。是不是已经觉得内存耗费挺多的啦?

这还只是小图片,若为一张的1000 * 1000,大小为1m的图片:

那他的特征量x的维度就应该有1000 * 1000 * 3 = 3million个,假设第一隐层中包含1000个单元,那对应的权重和偏移量的维度则为3000000000,30亿的数量那得有多可怕,每一次的运算都会牵扯到这么多的数值变化。因此,我们就需要一种更好的方法来处理这类似的情况。

二、边缘检测示例

卷积卷积,说了这么多次的卷积,究竟是怎么样进行运算的呢?

在之前我们曾经提及过关于神经网络对人脸识别的分解图。第一个图为第一层单元所获取到的边缘细节图,第二个图则为中间过渡层对人脸五官的识别,第三个图则为最终输出层对人脸的识别。

本次,我们将借助边缘检测,也就是第一张图的来源,做一个详细的分析。

上图为一张很普通的照片,我们可以利用神经网络对此进行物体识别。从边缘检测来看,模型可以将它分解为垂直边缘与水平边缘的识别,正如右侧俩张图片一样。

那它又是怎么获取到边缘的信息的呢?我们接着来探讨。

假设我们现在有一个6 * 6的一个灰度矩阵,它代表着一副特别简单的色图,而不是之前所提到的RGB三色图。

3

0

1

2

7

4

1

5

8

9

31

1

2

7

2

5

1

3

0

1

3

1

7

8

4

2

1

6

2

8

2

4

5

2

3

9

并且我们设置出一个滤波器(filter也叫卷积核)

1

0

-1

1

0

-1

1

0

-1

那此时我们要进行卷积运算,以‘*’作为重载运算符

3

0

1

2

7

4

1

5

8

9

31

1

2

7

2

5

1

3

0

1

3

1

7

8

4

2

1

6

2

8

2

4

5

2

3

9

*

1

0

-1

1

0

-1

1

0

-1

=

                                         

-5

-4

0

8

-10

-2

2

3

0

-2

-4

-7

-3

-2

-3

-16

 

这个我们应该怎么计算呢?6 *6 的矩阵和 3 * 3 的矩阵究竟是怎么运算,得出一个4 *4的矩阵呢?不着急,我们一步一步的来看。

3

(1)

0

(0)

1

(-1)

2

7

4

1

(1)

5

(0)

8

(-1)

9

31

1

2

(1)

7

(0)

2

(-1)

5

1

3

0

1

3

1

7

8

4

2

1

6

2

8

2

4

5

2

3

9

我们把卷积核先覆盖到灰度矩阵中,将对于的卷积核数值添加到其中(黄色框内数),可以从蓝框内计算出4 * 4 结果矩阵中的(1,1)

(1,1)      = 3 * 1 + 1 * 1 + 2 * 1 + 0 * 0+ 5 * 0 + 7 * 0 + 1 * -1 + 8 * -1 + 2 * -1 = -5

那么(1,2)应该怎么计算呢?我们将框右移动一格。

3

0

(1)

1

(0)

2

(-1)

7

4

1

5

(1)

8

(0)

9

(-1)

31

1

2

7

(1)

2

(0)

5

(-1)

1

3

0

1

3

1

7

8

4

2

1

6

2

8

2

4

5

2

3

9

(1,2)      = 0 * 1 + 5 * 1 + 7 * 1 + 1 * 0+ 8 * 0 + 2 * 0 + 2 * -1 + 9 * -1 + 5 * -1 = -4

由此规律我们可以得出剩余的其他结果。

现在,你能够理解,为什么做了卷积运算以后,结果为4 * 4 的矩阵了吧?

在垂直边缘检测中,我们可以将矩阵理解为如下所示:

第一个矩阵中,最左边的三条列向量,代表着亮度最高的左半部分,而右边的三条列向量,则代表了亮度为0的右侧灰色部分。

第二个矩阵中,同样的看法,左侧1向量为白色条,中间0向量为灰色条,右侧-1向量为黑色条。

第三个结果矩阵中,最左和最右侧向量代表着灰色,中间30,30向量代表着白色边缘,也就是第一个矩阵下面的图像里面的交界线。

我们或许会惊奇,为什么看上去比原本的线粗好多,这是因为原本的灰度图维度太小的缘故,若为1000 * 1000,那么显示出来的图像将会更形象一些。

上述内容便为用卷积实现垂直边缘检测。

三、更多边缘检测

在刚刚的计算中,我们可以归纳为如上图所示的第一行计算式。

那么,如果将亮度反转过来呢?比如类似与第二行计算式,我们看看出在结果里,30变成了-30,对应的图也又白色便为了黑色。这代表了边缘检测是可以检测出亮度的变化是由亮到暗还是由暗到亮。

第一行:从白色到灰色,这是一条正边

第二行:从灰色到白色,这是一条负边

而如果我们不需要亮度变换的方向,则直接采用绝对值就可以表示。

更多的例子:

现在我们已经知道了,上图所示的滤波器为垂直边缘检测滤波器,那么下图所示呢?

真机智!不错,是水平边缘检测滤波器。

假设我们现在弄一个相对复杂一点的灰度图来做个示范,左侧为次对角线区域代表暗,主对角线区域代表亮的一个模块图,在水平滤波器的卷积运算下,得到了右侧所示结果。

从结果中,我们可以看出,假设绿框所标记的30,则对应到灰度图中为俩层10和一层0,也就代表着亮度是从亮变向暗,为正边,因此为30。

而紫色框所标记的-30,则对应到灰度图中为俩层0和一层10,也就代表着亮度是从暗变亮,为负边,因此为-30。

那么黄色框的10呢,它是由灰度图中每一列的变化趋势做的一个运算得出来的中间值结果,俩条正边+一条负边,在维度小的时候(例如现在为6*6),它就会出现类似与10这种的过渡值,但是当维度大时,如1000 * 1000,那么这些中间值就会变得特别小。

事实上,滤波器的取值不一定非要为111,000,-1-1-1.在文献中,出现了许多大佬们发现的适应性更强的取值。例如:

并且,我们不仅仅可以使用手工设计出的滤波器,还完全可以将这九个框中值看成参数,在学习计算中自动的反向传播进行更新迭代,如之前学习的一般神经网络权重那样值更新一般。那么,不管是什么角度的边缘,我们都应该能够检测出来

四、Padding

在之前的例子当中,我们已经了解了灰度图矩阵,例如上图所示,我们在将它和一个3*3大小的滤波器做卷积运算后,得到了一个4 * 4的结果矩阵。关于结果维度与滤波器维度和灰度图维度关系:

假设图维度为n * n, 滤波器维度为f * f,则结果维度为(n – f + 1) * (n – f + 1)

如果我们就照此进行运算,会出现俩种不好的影响。

1、 图像会越来越小:

在卷积的过程中,会导致维度逐渐减小,若不采取其他操作,假如我们通过一个100层的深度网络进行运算,最后输出的将会丢失掉许多特征点。

2、 矩阵边缘计算次数少,中间计算次数多:

若不采取其他操作,在运算中,我们会发现,位于边缘的单元仅仅计算一次俩次,而位于中间的单元则会计算许多次,这样会导致图像外边缘的边缘检测效果差。

因此,我们可以通过填充矩阵,让它能够在卷积后,维度不变。

Convolution也有俩种:

1、Valid 卷积

不适用padding处理,在每次卷积后都会将维度减小。

3、 Same 卷积

通过填充矩阵,让矩阵在卷积运算后的输出与输入保证维度一致。

例如:

我们可以将6*6的矩阵进行扩充,拓展为8*8,最外层全为0,由于n-f+1 = 6可以知道,最后卷积运算输出的维度仍然为6,这时候的padding值为1.

那么,我们应该怎么选取padding值呢?

我们可以简单推导一下

n– f + 1 + 2 * p = n => p = (f - 1) / 2

也就是说,为f – 1 的一半,那我们最好就将滤波器的维度设置为奇数。否则就只有采取不自然的填充法了。

后续内容,下次分享

深度学习-卷积神经网络初识-1相关推荐

  1. 深度学习 卷积神经网络-Pytorch手写数字识别

    深度学习 卷积神经网络-Pytorch手写数字识别 一.前言 二.代码实现 2.1 引入依赖库 2.2 加载数据 2.3 数据分割 2.4 构造数据 2.5 迭代训练 三.测试数据 四.参考资料 一. ...

  2. 毕设 深度学习卷积神经网络的花卉识别

    文章目录 0 前言 1 项目背景 2 花卉识别的基本原理 3 算法实现 3.1 预处理 3.2 特征提取和选择 3.3 分类器设计和决策 3.4 卷积神经网络基本原理 4 算法实现 4.1 花卉图像数 ...

  3. 深度学习 卷积神经网络原理

    深度学习 卷积神经网络原理 一.前言 二.全连接层的局限性 三.卷积层 3.1 如何进行卷积运算? 3.2 偏置 3.3 填充 3.4 步长 3.5 卷积运算是如何保留图片特征的? 3.6 三维卷积 ...

  4. 毕业设计 - 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

    文章目录 0 前言 1 项目背景 2 花卉识别的基本原理 3 算法实现 3.1 预处理 3.2 特征提取和选择 3.3 分类器设计和决策 3.4 卷积神经网络基本原理 4 算法实现 4.1 花卉图像数 ...

  5. 深度学习——卷积神经网络的应用——目标检测

    一.理论部分介绍 1. 目标定位和特征点检测 图片检测问题: 分类问题:判断图中是否为汽车: 目标定位:判断是否为汽车,并确定具体位置: 目标检测:检测不同物体并定位. 目标分类和定位: 对于目标定位 ...

  6. 2020-12-09 深度学习 卷积神经网络结构分析

    1. 结构总览 首先我们分析下传统神经网络对于图片的处理,如果还是用CIFAR-10上的图片,共3072个特征,如果普通网络结构输入那么第一层的每一个神经单元都会有3072个权重,如果更大的像素的图片 ...

  7. 深度学习卷积神经网络大事件一览

    转载自:http://blog.csdn.net/u013088062/article/details/51118744 深度学习(DeepLearning)尤其是卷积神经网络(CNN)作为近几年来模 ...

  8. 深度学习——卷积神经网络 的经典网络(LeNet-5、AlexNet、ZFNet、VGG-16、GoogLeNet、ResNet)

    1. CNN卷积神经网络的经典网络综述 下面图片参照博客:http://blog.csdn.net/cyh_24/article/details/51440344 2. LeNet-5网络 输入尺寸: ...

  9. 计算机视觉与深度学习 | 卷积神经网络实现异常行为识别(目标分割与提取)

    ################################################ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...

最新文章

  1. 如何避免Java中的回调“地狱”
  2. C++ stringstream的用法
  3. 浅谈如何防范电池事故
  4. 在TCP/IP模型中,( )处理关于可靠性、流量控制和错误校正等问题。
  5. 总线及数据传输技术【待完善】
  6. array reduce
  7. 画面轻松浪漫的伪原创工具
  8. [Unity][FlowCanvas][NodeCanvas] ForEach 不适合连接 Wait,FSM 的 SubFlowScript 接受不到事件
  9. css div中文字位置_计算机二级Web(4):CSS基础 (上)
  10. 我有一张1996年版一元钱,值多少钱?
  11. github本地库及clone常用命令
  12. 高防服务器的机房硬件防火墙类型和主要功能
  13. 电磁干扰类型以及--电感和磁珠
  14. 三.Java基本语法
  15. nc 自开节点做参照_NC6period;3常见问题记录
  16. 打开Beyond Compare报This license key has been revoked:
  17. 【重识云原生】第四章云网络4.8.4节——OpenStack与SDN的集成
  18. Revit打印工具 RevitPrinter
  19. 中国少数民族艺术类毕业论文文献都有哪些?
  20. 12306 抢票 python + selenium + chrome (二) 基础准备的软件和材料

热门文章

  1. VMware虚拟机不能直接安装win11最新版系统?添加TPM可信平台模块就可以了
  2. 使用CreateFileMapping来进行进程间的通信和使用信号量来进行同步操作——进程间实现图片传输
  3. 学习数控自动编程,先了解这五个步骤
  4. 托福听力专项 // Unit1 Listening for Main Ideas //共5篇conversations
  5. 11个springboot快速开发的项目,接私活利器
  6. 关于牛仔裤你一定要知道的16条
  7. glBlendFunc()混合
  8. MYSQL escape用法
  9. BP神经网络及拟合实例
  10. 【iOS开发】—— nil、Nil、NSNull和NULL