[深度学习]卷积神经网络CNN-卷积层

884 阅读4分钟

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战

卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)”。(转自百度百科)

作为一个调参侠,CNN是我们常见的网络,在许多图像处理的领域都能看见它的影子,这章中我将介绍卷积神经网络中的核心-卷积层,并介绍该层参数量的计算。

一、卷积核

首先我们先来看看什么是卷积核:

image.png

卷积核是一个二维的n*n序列(n一般为奇数,如1*1,3*3,5*5等),上面就是一个3*3的卷积核。

再引入一个单层的5*5“图像”:

image.png

所谓“卷积”,就是用卷积核按次序与“图像”内积求和的过程:

image.png

上面步骤的计算如下图:

image.png

设步长s=1(步长是可以调的),下一步计算:

image.png

下面是完整步骤(图片来源)

002928_hnHI_876354.gif

二、神经元

每个神经元是n个卷积核加上一个偏置值b组成的,n的值与输入图像的层数相同,如:我们要对一张RGB三色组成的照片进行卷积,就需要3个卷积核。对上述内积求和的和再求和(用人话讲就是一个卷积核对自己负责的层进行卷积,将三个得到的结果加起来),最后将结果加上转置值b,就得到了一个得数(上一张经典图,当初学习也是看这张图会的):

image.png

另外要注意的点是,如果图像的长度不能刚好被卷积核包含进去,会在旁边进行扩充,即图中灰色标0的格子。

重复中的操作,我们就能使用一个神经元得到了一层输出。如果使用多个神经元,就能得到多层的输出,即输出的深度。

因此,卷积层输出的深度是由神经元的个数决定的。当然,卷积核尺寸要完全一致。

下面放出完整动图(入门必看图,转了好几手了): 1845730-5ca69abe03f57d72.webp

三、卷积模式

要注意,卷积模式也不止一种,分为三类:

  1. full
  2. same
  3. valid

full

开始和结束的标志是:卷积核边碰到图像边:

image.png

(选中部分是卷积核)

这种卷积模式似乎不太常见到(也可能是我学的还不够深入)。

same

开始和结束的标志是:卷积核中心与图像边重合:

image.png

之所以叫same,是因为当步长s=1时,卷积层输出层的尺寸和输入尺寸是完全一致的(再次强调深度由神经元数量决定,和卷积模式无关)。

valid

开始和结束的标志是:卷积核完全进入与图像:

image.png

valid就是我们上面介绍的卷积模式,是最常见到的模式,上面已经介绍很多了,这里放出一个输出层大小计算公式:

图像大小 -> a*a*d
卷积核尺寸 -> i*i
神经元数量 -> n
步长 -> s
神经元:d个卷积核加一个转置数b
输出层大小: [(a-i)/s + 1]*[(a-i)/s + 1]*n

(重要的事情说三遍,输出层数由神经元数量决定)

四、参数量的计算

卷积层的参数主要位于卷积核中,上面我们进行了那么多计算的卷积核是由反向传播调整出来的。

还有一个比较容易忘记的地方(应该就我忘了⊙﹏⊙∥)是转置值b也是参数的一部分,用于整体调节。

也就是整个神经元的量(不是神经元还能是啥╮(╯-╰)╭),因此得出下列计算公式:

图像大小 -> a*a*d
卷积核尺寸 -> i*i
神经元数量 -> n
参数量:n*(i*i*d+1)

(注意:步长不影响参数量,但会影响计算量)

举个例子:

一张图像大小:150*150*3

我们对其进行继续卷积操作,使输出为146*146*32

要完成这个卷积操作,我们令步长s=1,卷积核大小i*i=5*5,神经元数量n=32(我觉得不用再重复说明了)。

参数量=32*(5*5*3+1)=2432。