学习深度学习一定要学习CNN,而CNN的发展非常快,从 LeNet 到 AlexNet 到 VGG 到 GoogleNet 再到 ResNet 再到 DenseNet,学习这些经典的网络首先需要了解卷积神经网络的相关知识。
下图就是LeNet的网络结构,如果你不懂CNN,是完全不明白这到底是个什么东西的。
Why CNN
首先,我们使用神经网络可以实现回归求解,图片的识别当然也是可以使用神经网络来求解。
但之前我们使用了全连接的多层感知机,试想一下,一张图片RGB共3个channels,维度为1000 × 1000 × 3,那么输入就有300万之多,若每个输入单元与隐藏层的每个权重单元(假设共有1000个隐藏单元)进行相乘,那么最后矩阵大小就有1000 × 300万,即30亿个参数,这是一个非常巨大的数字,所以使用全连接网络是不现实的。
所以人们相出了一种卷积计算,先从边缘检测引入它。
边缘检测示例
从网上随便一张图片:
那么它的边缘检测就是吴磊的半身轮廓。因为图片由像素组成,所以每个轮廓的像素和周围的像素是不同的,如何进行检测呢?这就需要提到卷积运算了。
二、重要概念
1. 卷积运算
卷积运算是将输入和核函数进行对应相乘并相加,图示如下:
而卷积运算有以下重要的思想:
- 稀疏交互:边缘检测在整个图像上来说是稀疏的
- 参数共享:权重被计算多次
- 等变表示: f ( g ( x ) ) = g ( f ( x ) ) f(g(x)) = g(f(x)) f(g(x))=g(f(x))
2. 卷积层的组成
卷积层由以下部分组成:
- 卷积计算:就是上面图片所示
- 卷积核kernel
- 边界填充padding
- 步长stride
当图像输入大小为
n
×
n
n×n
n×n,卷积核大小为
f
×
f
f×f
f×f 时,输出的大小为
(
n
−
f
+
1
)
×
(
n
−
f
+
1
)
(n-f+1) × (n-f+1)
(n−f+1)×(n−f+1)
当加入padding(
p
p
p )后,输出的大小为
(
n
+
2
p
−
f
+
1
)
×
(
n
+
2
p
−
f
+
1
)
(n+2p-f+1) × (n+2p-f+1)
(n+2p−f+1)×(n+2p−f+1)
若加入stride(
s
s
s ),则输出的大小为
⌊
(
n
+
2
p
−
f
)
s
+
1
⌋
×
⌊
(
n
+
2
p
−
f
)
s
+
1
⌋
\lfloor{\frac{(n+2p-f)}{s}+1}\rfloor × \lfloor{\frac{(n+2p-f)}{s}+1}\rfloor
⌊s(n+2p−f)+1⌋×⌊s(n+2p−f)+1⌋
3. 激活函数
在LeNet中使用的是sigmoid,也可以使用tanh,但是到了AlexNet中提出了使用ReLU这个激活函数,为什么呢?因为它要比tanh更快达到低错误率。
4. Pooling
Pooling是为了提取一定区域的主要特征,并减少参数数量,一般采用两种池化层:MaxPooling和AveragePooling。
下图采用的是MaxPooling:
![](https://img-blog.csdnimg.cn/20191024171054956.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2thcnJ5X3p6ag==,size_16,color_FFFFFF,t_70)
三、CNN结构组成
- 卷积层Conv
- 池化层Pooling
- 全连接层FC