一、卷积
对于普通神经网络来说,每层神经元的输入,即是上一层神经元的输出。
假设一张图片为1000×1000,就会出现1000×1000个参数
若下一层神经元个数为10^6个
全连接参数为1000×1000×10^6 =10^12个
这个参数量是非常大的,这样处理不仅会增加训练时计算机的负担,
由于参数量过大,其模型表达能力也非常强。虽然在训练集上效果极佳,但是在训练集上测试效果较差。
即出现过拟合问题。
因此,我们使用了卷积操作来解决这个问题。
输入图像:
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 |
### 卷积核: | ||||
1 | 0 | 1 | ||
:————: | :————: | :————: | ||
0 | 1 | 0 | ||
1 | 0 | 1 | ||
### 输出: | ||||
35 | ? | ? | ||
:————: | :————: | :————: | ||
? | ? | ? | ||
? | ? | ? | ||
卷积核在输入图像上滑动并进行点积运算,得到卷积后的图像。 | ||||
其滑动长度叫做步长 | ||||
输出size=输入size-卷积核size+1 |
显然,每次卷积会使图像size变小,在CNN中可能有不只一层卷积层。如果图像本身较小,很有可能经过多次卷积操作使图像变为1×1的像素点。这样对描述图片的特征是很不直观的。
因此我们可以使用一种padding操作,在输入图像周围加入值为0的像素点。
0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|
0 | 0 | |||||
0 | 0 | |||||
0 | 0 | |||||
0 | 0 | |||||
0 | 0 | |||||
0 | 0 | 0 | 0 | 0 | 0 | 0 |
当然加入几层padding和卷积核的大小有关,进行合适的处理即能够使输入和输出的size相同。
对于多通道图片,我们将卷积核也变为多通道即可。不通通道图片上卷积参数并不共享,多个通道卷积之后的相应位置像素相加作为最后的输出(activation maps)。
同样,通过多个卷积核,能够产生多通道输出,提取出不同的特征。
二、激活函数
Sigmoid=1/1+e^-x
tanh=tanh(x)
ReLU=max(0,x)
Leaky ReLU=max(0.1x,x)
Maxout
ELU 等
对于卷积神经网络来说,常用的激活函数为ReLU函数。
5 | 6 | -2 |
---|---|---|
-10 | 0 | 4 |
9 | -1 | 7 |
ReLU激活后->
5 | 6 | 0 |
---|---|---|
0 | 0 | 4 |
9 | 0 | 7 |
卷积-Summary
- P = 边距(padding)
- S = 步长(stride)
- 输出Size =(n-p)/s + 1
- 参数数目 = kw × kh × Ci × Co
- Ci:输出通道数
- Co:输出通道数
- Kw,Kh:卷积核长宽
三、池化
输入图像:
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 |
Max-pool操作 | ||||
Stride = 2 | ||||
Kernel_size = 2 * 2 | ||||
### 输出: | ||||
7 | 9 | |||
:————: | :————: | |||
17 | 19 |
Avg-pool操作
Stride = 2
Kernel_size = 2 * 2
输出:
4 | 6 |
---|---|
14 | 16 |