卷积神经网络详解 - 卷积层逻辑篇

本系列文章为深度学习笔记,方便自己回看。

卷积计算概述

对于图像识别来说,卷积神经网络的效果要好于全连接神经网络。我在首次接触卷积时,隐约记得在大一高数课程中曾经提及,但具体已经无法名状。何谓卷积,知乎的这个回答,"如何通俗易懂地解释卷积" ,解释得很详细,摘出部分如下,以方便阅读。

"从数学上看,卷积是一种运算。我们称(f*g)(n)为f,g的卷积,其连续的定义为

(f\ast g)(n) = \int_{-\infty }^{\infty }f(\tau )g(n-\tau )d\tau

其离散的定义为

(f\ast g)(n) = \sum_{\tau =-\infty }^{\infty }f(\tau )g(n-\tau )"

我对于以上定义的理解为,存在两个函数f(x)和g(x), 其卷积运算(f * g)(n)是指,对f(x)g(y)这样的乘积进行求和(连续为积分,离散为求和),其中x与y需要满足条件:只能落在二维坐标系形如y=n-x的直线上,这是一条斜率-1,与y轴、x轴交点均为n的直线。更加形象具体的解释,上面知乎相关的问答有很多不错的解释。

在卷积神经网络中,卷积运算是对两个矩阵进行的。如下图,左侧为输入矩阵M,中间为过滤器F(也叫卷积核),F以一定步长在M上进行移动,进行点积运算,得到右侧的输出矩阵O。这个就是卷积神经网络中卷积层最基础的运算。在实际的操作中,还存在一些额外的操作,下面会详细叙述。

该图出自:Convolutional Neural Networks - Basics

输入层

在使用卷积神经网络进行图像识别时,输入为进行过转换的图片数据,一张宽为w,高为h,深度为d的图片,表示为h*w*d。这里,深度为图像存储每个像素所用的位数,比如彩色图像,其一个像素有RGB三个分量,其深度为3。

从数学的角度来看,h*w*d的图片即为d个h*w的矩阵。例如6x16x3的图片,其对应3个6x16的矩阵。在大部分运用中,输入图片的大小h和w,一般是相等的。

过滤器(卷积核)

在卷积运算时,会给定一个大小为F*F的方阵,称为过滤器,又叫做卷积核,该矩阵的大小又称为感受野。过滤器的深度d和输入层的深度d维持一致,因此可以得到大小为F*F*d的过滤器,从数学的角度出发,其为d个F*F的矩阵。在实际的操作中,不同的模型会确定不同数量的过滤器,其个数记为K,每一个K包含d个F*F的矩阵,并且计算生成一个输出矩阵。

一定大小的输入和一定大小的过滤器,再加上一些额外参数,会生成确定大小的输出矩阵。以下先介绍这些参数。

1)Padding。在进行卷积运算时,输入矩阵的边缘会比矩阵内部的元素计算次数少,且输出矩阵的大小会在卷积运算中相比较于输入变小。因此,可在输入矩阵的四周补零,称为padding,其大小为P。比如当P=1时,原5*5的矩阵如下,蓝色框中为原矩阵,周围使用0作为padding。

2)进行卷积运算时,过滤器在输入矩阵上移动,进行点积运算。移动的步长stride,记为S。当S=2时,过滤器每次移动2个单元。如下图,红色框为第一步计算,蓝色框为S=2时的第二步运算。

有了以上两个参数P和S,再加上参数W(输入矩阵的大小),过滤器的大小F,输出矩阵的大小为

(W-F+2P)/S + 1

对于5x5的输入矩阵,过滤器大小F=3,P=1,S=1,其输出矩阵的大小为(5-3+2)/1+1=5。可见,在步长S为1,且进行了P=1的padding后,其输出矩阵的大小和输入一致。

现在考虑当输入有多个深度时的情况。当输入为5x5x3,P=1,并且有K个过滤器时,每一个过滤器都为3x3x3。这里,我们把输入的3个7x7矩阵(5x5进行padding后得到7x7)命名为M1,M2,M3,第k个过滤器(0<k<K)的3个3x3矩阵命名为F1,F2,F3,输出的第k个矩阵(0<k<K)命名为Ok。卷积运算中,输入矩阵M1和过滤器F1,M2与F2,M3与F3进行卷积运算。卷积运算详细过程如下

1. 在M1中,从最左上角,取感受野大小F*F的子矩阵,与F1进行点积运算,即对应位置元素相乘,再求和得到结果O11.

2. M2和F2进行同样的运算,得到结果O22;M3和F3得到O33.

3. O11+O22+O33相加,再加上偏移量b0,得到输出矩阵Ok左上角的第一个元素.

4. 按照步长S,从M1,M2,M3中获取另外一个感受野大小的区域,对应F1,F2,F3进行步骤1~3的计算,最终得到完整的输出矩阵Ok

5. 更换过滤器k+1,重复1~4的运算,得到K个输出矩阵。

总结以上过程,输出矩阵的每一个元素,是由对应过滤器不同深度的矩阵,作用于相应深度输入矩阵的不同位置,进行点积运算,再加上偏移量bias所得。

在斯坦福的卷积神经网络课程有,有一个很典型的例子如下。此处分析两个步骤,完整的例子见以下链接。

http://cs231n.github.io/convolutional-networks/

在这个例子中,输入矩阵为5*5*3,即W=5,填充P为1,过滤器有K=2个,每个过滤器的大小为3*3*3,即F=3,同时设定计算步长S=2。这样可得到输出中单个矩阵的大小为(5-3+2*1)/2+1=3,由于K=2,所以输出的3*3矩阵有2个。下面为具体的计算过程

1. 首先从输入矩阵的最左边开始取得3*3的感受野,每一个深度的输入矩阵对应每一个深度的过滤器,进行点积运算,然后加上偏移Bias,得到第一个输出矩阵的第一个元素。详细过程为

输入矩阵1:r1 = 0*0+0*1+0*1+0*(-1)+1*0+0*0+0*1+0*0+1*0=0

输入矩阵2:r2 = 0*0+0*0+0*0+0*1+0*0+0*1+0*0+2*0+0*0 = 0

输入矩阵3:r3 = 0*(-1)+0*(-1)+0*0+0*0+0*0+2*(-1)+0*(-1)+0*0+2*0 = -2

输出矩阵元素(绿框中元素)O11 = r1+r2+r3+b0 = -1

2) 然后将感受野在3个输入矩阵上同时移动2个步长,如蓝框所示,重复1)中描述的运算,得到O12=-1,计算过程此处不再赘述。

3)将感受野在输入矩阵中依次移动,当完成第一个输出矩阵的计算后,使用第二个过滤器再重复一次,得到第二个输出矩阵。卷积计算完成。

在上面的计算中,每一个深度上的输入矩阵,其每一个步长的计算都是用同一个过滤器矩阵,这个现象被称为参数共享(parameter sharing)。其实这是一种简化,在未简化的情况下,同一深度矩阵上每一个步长的卷积计算,都需要使用不同的过滤器,这样会造成神经网络中参数过多,所以在实际操作中,会采取如上所述的参数共享策略,减少参数个数。

到此,卷积神经网络卷积层的计算理论部分已经说完。下面一篇文章将从开发的角度,详细分析下,在实际的计算中,具体的数据结构和计算方法。

参考文献:

1. Convolutional Neural Networks (CNNs / ConvNets) 

2. Convolutional Neural Networks - Basics

3. 如何通俗易懂地解释卷积

  • 42
    点赞
  • 244
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值