本文内容较大部分是从b站up主那学的:Linus有点牛
本质
提取特征
与传统NN区别
传统输入为直接的向量,直接一列,一个特征,而CNN不会,CNN会将输入的h×w×c的样本进行提取特征。
整体架构
由输入层,卷积层(提取特征),池化层(压缩特征),全连接层组成
特征图变化
卷积(Convolution)
以灰度图为例的单一卷积操作
分割,因为每个区域特征不一样→通过滤波器(fliter)进行特征提取,得到特征图
- 滤波器/卷积核(Fliter/Kernel):用来提取特征的东西,就权重参数矩阵(卷积版)。
- 权重参数矩阵:如名,一个矩阵。
- 内积:所采取的运算方式,求完后还要加上一个偏置值(Bias)才能出特征值
- 卷积参数共享:这个就属于对传统神经网络的一个改进,传统神经网络的参数就十分繁杂参数数量多,更吃算力。
上述为一个通道(channel)上进行的操作,像图这样的一般来说就是RGB三个通道,一次卷积中有几个通道就有几个卷积核,且一次卷积中卷积核长宽应一致
大多不止一此卷积。
卷积层涉及参数
- 滑动窗口步长(Stride):步长反映了此次特征提取的精密程度,步长越短,卷积越精密。
- 卷积核尺寸(Kernel Size):越大,提取特征的空间范围就越大,考虑的东西就越多。
- 边缘填充(Padding):补0,保留边缘特征,不加0的话会产生其他不必要的影响。
- 卷积核个数(Number of Fliter):每个卷积核负责提取不同的特征,卷积核越多,提取的深度就越深。
PS:怎么获取权重参数矩阵?炼丹试出来?还是怎么算?
卷积结果计算公式
长度
H 2 = H 1 − F H + 2 P S + 1 H_{2} = \frac{H_{1}-F_{H}+2P}{S} +1 H2=SH1−FH+2P+1
宽度
W 2 = W 1 − F W + 2 P S + 1 W_{2} = \frac{W_{1}-F_{W}+2P}{S} +1 W2=SW1−FW+2P+1
池化(Pooling)
降低特征图的空间维度,保留主要信息,防过拟合,加速。池化操作通常包括最大池化和平均池化两种常见的方式。
操作
最大池化(Max Pooling)
在池化窗口内选择最大的值作为输出,能保留最显著的特征。
平均池化(Average Pooling)
计算池化窗口内平均值作为输出,不过比max用的更少,因为他准确度没有max好,(这俩对算力的要求哪个大?)
- 池化窗口(Pooling Window):取样区。
- 感受野(Receptive Field):特征图上的单个神经元感受到的输入图像的区域大小。
激活函数
挂在卷积层后面,每个卷积层后面挂一个,常见的用在CNN里面的有
1.ReLU
f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)
2.Sigmoid
f ( x ) = 1 1 + e − x f(x)= \frac{1}{1+e^{-x}} f(x)=1+e−x1
3.Tanh
f ( x ) = e x − e − x e x + e − x f(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} f(x)=ex+e−xex−e−x
各有优劣,这里不再赘述。
看有人讲什么,大概套路是两个卷积层加一个池化,循环几次套路然后最后全连接。
PS:咋判断CNN有几层?带权值参数方程的才算一层,实际上也就算上所有卷积层加上全连接层数量,就是CNN层数。
全连接层(Fully Connected Layer)
卷加池完后转换成一条向量,之后才能进入全连接,全连接层里面有权重参数矩阵。他的作用就是将前面层提取的特征整合并映射到最终的输出。
具体数学表达式为
y
i
=
f
(
∑
N
j
=
1
w
i
j
⋅
x
i
+
b
i
)
y_{i}=f( {\textstyle \sum_{N}^{j=1}w_{ij}\cdot x_{i}}+b_{i } )
yi=f(∑Nj=1wij⋅xi+bi)