入手DL之通过卷积理解VGG16


现在由于学习和科研的需要,入手深度学习,之前一直在看关于机器学习的文章,很多同学跟我说传统的机器学习只是用在小规模数据上,具有相对较高的表现。因此,在他们的忽悠下入坑。(废话说的多了,正式进入正文,这也是第一篇博客,不正之处还请见谅)

刚刚开始接触什么卷积神经网络很懵逼,根本不知道从哪里下手,在广大博友的帮助下,以及基于自己的一点见解,将自己的理解作为基础概念的奠基石。

基本的卷积过程
卷积的基本概念
详解VGG16每一层

基本的卷积过程

卷积过程

常常听有人说卷积神经网络,具体是什么呢?什么才是所谓的卷积?网络中的卷积又是怎么一回事呢?
这里借大佬文章,做个引用,这是详细地址:https://mlnotebook.github.io/post/CNN1/

卷积过程示意图
左边是一个55的二维矩阵(输入矩阵),中间是一个33的卷积核(kernel),通过上述操作之后,就会得到一个3*3的二维矩阵,其中每一个位置值的大小对应的是输入矩阵上的蓝色部分,与卷积核上的,对应元素分别相乘再相加而得到的。具体过程如图所示。
注: 在该图中,卷积核是一格一格扫过去的,这里的一格我们称之为步长(stride)—>如果不是一格又会是怎么样呢?

产生的这个新的矩阵相比与原来的矩阵,矩阵的维数更低了。为什么矩阵的维数会降低呢??是否有什么规律可循

是的,答案是肯定的。原始的输入矩阵是5*5的,卷积核是3*3的,出来的结果(在stride=1时)是3*3的。
所以可以得到如下规律:最后卷积的结果的维度 = 原始输入矩阵维度 - 卷积核维度 + 1
**如果我不想减少矩阵维度,那又该如何做呢?**

padding

这里还是使用大佬的博客作为说明,具体地址:https://mlnotebook.github.io/post/CNN1/
padding过程
在最外一层全部0,这样通过上述动图的展示,相信应该能理解这个过程,而这一加零的操作我们称之为(padding)。

两层之间的池化(pooling)

这里依然需要使用大佬博客的图片,具体地址还是上述。(感谢大佬的制作和付出)
最大池化
其实,貌似和之前的一样,没有什么区别,还是三个矩阵之间的运算而已,但是这里不是一行一行扫过去,而是不重叠的,输入矩阵是中间部分(卷积核)的整数倍,最终池化得出的结果是把原来的维度减少到1/n,这是最根本的原理。在此处可以看到中间的英文是max(),意思是,选取输入矩阵粉红色框中最大的一个元素,作为当前区域的代表值,显然第一个代表值是5。

**思考一下,是不是只能选择最大的最为代表值呢?**
答案是否定的,还有一种比较常见的做法是做平均,顾名思义就是,将该区域的平均值作为该区域的代表

重叠(overlap)

卷积核移动的步长(stride),小于卷积核的边长(一般为n*n的矩形)时,那么就会出现重叠(overlap) 现象,也就是最开始,第一副图中所展示的那样。如果卷积核移动的步长与卷积核的边长相一致,则不会出现重叠,类似于池化过程。

其实,通过上述介绍,一些卷积基本的概念和知识点都已明了。这里再进行一下总结:卷积(convolution),池化(pooling), 步长(stride), 卷积核(kernel), padding(一般直接说padding,没有中文名称)

相信经过上述讲解,读者大概已经有了一定的印象,这里为了方便跟下面的VGG网络联系,对padding再进一步说明:
比如:需要对一个300300的原始矩阵使用33的卷积核做卷积,按照之前的公式,得出来的结果应该是298298(因为(300-3+1)嘛),我想要得到还是300300的。
那就可以采用之前说的方法了,在300300的输入矩阵的外围添加全0,这样原始的输入矩阵就变成了302302,这样一来,刚好可以抵消掉原来的两层,使得结果变成300*300的矩阵。

最后说明一下:通道,比如,我们常说的一张灰度图片只有一个通道(和以前小时候看过的黑白电视差不多那种颜色),而彩色图片则有RGB三种颜色,对应三个通道。

VGG16网络

VGG16顾名思义一共有16层,我们主要讲前面的几层(超级详细)
看其他的神经网络最有用的办法就是看官方的数据表格:

VGG网络图
我之前拿到这个表的时候,也是十分困惑,写的什么东西,一脸懵逼啊。后来有看到大佬的博客,才懂了,原来是这样子的。

Conv3-512 意思是: 512个3*3的卷积核

基于以上知识的理解,接下来正式进入正题,肢解VGG16卷积神经网路

详解VGG16的每一层

从输入到Conv_1:

在这里插入图片描述
图中两个黄色的是卷积层,是VGG16网络结构十六层当中的第一层,和第二层,合称为Conv_1(以maxpool为界,将VGG16分为5大层),如图所示。

主要讲述第一个,也就是第一层,怎么就把一个300 * 300 * 3的矩阵变成一个300 * 300 * 64的呢?

还是通过一幅图来说明一下(不好意思,我又盗图了)。原博客:https://blog.csdn.net/tommorrow12/article/details/80103977
在这里插入图片描述
假设蓝色框,是一个300 * 300 * 3的RGB图像,而橙色的是一个3 * 3 * 3的卷积核,我们对一个三维的27个数求和(就是3* 3* 3矩阵中的每一个数分别相乘再相加,一共27个),一直扫过去,按照刚才所述理论,得到的应该是一个一维的298*298的矩阵(因为卷积核也是三维的呀,所以得到的就是一维的)

回想一下刚刚的padding过程,是不是可以用在这里,从而得到一个300* 300* 1的矩阵(300* 300* 1实际上就是300*300)

VGG在这一层有64个卷积核(也就是有64个不同的3* 3* 3的卷积核),因此原来的300* 300* 1变成了300* 300* 64,于是就得到了最后所想要的东西,也就是一开始是的绿色框框。\ast

注意: 这部分的内容很重要,如果没有理解不妨多看两遍,这里没有问题的话,接下来就十分简单了。

从Conv_1到Conv_2:

还是参考博客大佬的图片。从图中可以看出这是在进行池化操作,中间的池化核(本身并没有这个概念,池化本身就是一种特殊的卷积,这里的kernel也属于卷积核,只是为了方便理解所以这么说)
的大小是2* 2* 64的,图中还说明了s=2,(这里的s是步长stride),根据之前的知识可以得到如下结论:

步长是2,而核的大小是2* 2* 64的,步长=核的维度,所以矩阵本身就不会有重叠(overlap),刚好减半,一次卷积后,得到的是150* 150* 1的矩阵,而这里有64个池化核(不理解的可以看前面的讲解),因此,最后的结果就是150* 150* 64

在这里插入图片描述

Conv_2到Conv_3:

到目前为止,我们已经知道了:原输入是300* 300* 3,过了第一层出来的就是150* 150* 64,第二层的卷积核仍然有128个,于是卷积后的结果就是75* 75* 128,如下图所示。(自己随手画的请勿见怪),继续往下分析。

150* 150* 64
2* 2* 64
2* 2* 64
75 * 75* 128

进入Conv_3的过程:

在这里插入图片描述
如果上面的都理解了,这里也就不必再细说了,这里有256个3* 3* 128的卷积核,使用了padding,因此最后的结果就是75* 75* 256。如果有不理解请仔细阅读之前的内容。

从Conv_3到Conv_4之间的过度:

在这里插入图片描述
池化的话,没有什么问题,但是这里的75是奇数,怎么搞?

在75这里加个1,使之变成76,这样就可以进行上述步骤了
具体的实现过程就不讲了(自己也是刚刚入手DL)。

后续步骤

后面的其实就很简单了,单纯从理解的角度来说,肯定是没有问题的。根据给出的VGG的表格,查找每一层有什么样的卷积核?多少个?池化的大小?步长?是否padding?

参考博客

https://blog.csdn.net/tommorrow12/article/details/80103977
https://mlnotebook.github.io/post/CNN1/
感谢博友的付出,这里主要是基于第一篇的参考,并对其中的一些做了补充

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值