(五)卷积神经网络(CNN)
为什么需要卷积神经网络
下面我们先来看一幅图片
这时一幅28*28的图片,由于是彩色图片,每个像素点有三个通道。基于这张图片的数据,我们构建如下的网络结构
计算网络需要的参数可以发现,就算是这个比较简单,数据量比较小的网络也需要390K个参数。也占用了比较大的内存。而在早期的时候内存根本就装不下这些参数。当时科学家们借助了生物学的概念
上面的小孩子,他一眼不会看到全部桌上的东西,最先看到的应该是蛋糕,然后再慢慢看到其他的东西。人眼的这个属性就是局部相关性,所以科学家们基于人眼的这个性质提出了卷积神经网络。
什么是卷积
如上图,每次感受的是一个小方块,而不是全局的大空间,所以这样每次需要计算的参数量就大大减少了。而且小方块会不断移动,在移动的过程中权值共享(小方块扫描过程中权值不变的)。
如上图左边的图是全连接的方式,右边是卷积,可以看到,卷积操作生成的点的数据只考虑小方块中的数据,通过小方块中数据和原来图中对应位置方块大小的数据进行点乘再累加得到。可以看出相比于全连接的计算方式,卷积操作大大减少了运算。
通过下面一幅图片能够更好理解卷积操作:
output中的点的数据是由kernel中的数据和kernel对应位置input的数据相乘相累加得到。下面我们来用公式表达下:
o
u
t
p
u
t
(
x
,
y
)
=
∫
i
n
p
u
t
(
x
′
,
y
′
)
∗
k
e
r
n
e
l
(
x
−
x
′
,
y
−
y
′
)
d
x
d
y
output(x, y) = \int input(x',y')*kernel(x-x', y-y')dxdy
output(x,y)=∫input(x′,y′)∗kernel(x−x′,y−y′)dxdy
卷积神经网络
对于卷积操作我们知道了,下面我们来看多个kernel的情况
我们把通过卷积操作生成的叫做feature map,可以看到一个kernel会生成一个feature map,所以多个kernel就会生成多个feature map。如果大家对为什么要有多个kernel有疑问的话,这里简单解释下,其实一个kernel就代表一个观察角度(可以这么理解),所以多个kernel代表多个观察角度,利用多个kernel我们可以得到更加全面的信息。
下面具体看下多个kernel的计算
这里Input_channels代表输入通道数量,Kernel_channels代表kernel的通道数量,Kernel_size代表kernel的大小,stride代表每次移动的步长,padding是表示扩展边缘的长度(用来保持生成feature map的大小和原来的大小一样)上面公式是计算生成图片大小的。多个kernel的计算情况如下:
使用PyTorch实现卷积神经网络的运算过程
Conv2d的第一个参数是input channel, 第二个参数是kernel的数量,第三个参数是kernel的大小, 第四个参数是步长,第五个参数是扩展边缘的大小。
下面是另一种方法
直接使用layer,这样可以多调用一些方法,比较方便。
池化与采样
池化(Pooling)
max pooling
采用MaxPool2d函数进行计算。
avg pooling
对以上方块中的值取平均即可
采用avg_pool2d函数进行计算。