文章目录
九、池化、线性、激活函数层
1、池化层(Pooling Layer)
(1)概述
- 池化运算:对信号进行“收集”并“总结”,类似水池收集水资源,因为得名池化层
- 收集:一个多变少的过程,如下图所示,输入为
4
×
4
4\times4
4×4,输出为
2
×
2
2\times2
2×2
- 总结:总结有两种方式,一种是取最大值,一种是取平均值
(2)PyTorch
实现
<1> nn.MaxPool2d()
nn.MaxPool2d(kernel_size,
stride=None,
padding=0,
dilation=1,
return_indices=False,
ceil_mode=False)
- 功能:对二维信号(图像)进行最大值池化
- 参数:
kernel_size
:池化核尺寸;stride
:步长;padding
:填充个数;dilation
:池化核间隔大小;ceil_mode
:池化过程中有一个除法操作,当不能整除时,如果参数设置为True,尺寸向上取整,默认参数值是False,向下取整;return_indices
:记录池化像素索引,记录最大值像素所在的位置索引,通常在最大值反池化中使用- 实例:
maxpool_layer = nn.MaxPool2d((2, 2), stride=(2, 2)) # input:(i, o, size) weights:(o, i , h, w)
img_pool = maxpool_layer(img_tensor)
上图右边为池化后的图片
<2> nn.AvgPool2d
nn.AvgPool2d(kernel_size,
stride=None,
padding=0,
ceil_mode=False,
count_include_pad=True,
divisor_override=None)
- 功能:对二维信号(图像)进行平均值池化
- 参数:
kernel_size
:池化核尺寸;stride
:步长;padding
:填充个数;ceil_mode
:尺寸向上取整;count_include_pad
:如果参数值为True,使用填充值用于计算;divisor_override
:求平均值的时候,可以不使用像素值的个数作为分母,而是使用除法因子;- 实例:
avgpoollayer = nn.AvgPool2d((2, 2), stride=(2, 2)) # input:(i, o, size) weights:(o, i , h, w)
img_pool = avgpoollayer(img_tensor)
<3> nn.MaxUnpool2d
nn.MaxUnpool2d(kernel_size,
stride=None,
padding=0)
forward(self, input, indices, output_size=None)
- 功能:对二维信号(图像)进行最大值池化上采样,将小尺寸图片池化为大尺寸图片。如下图中的反池化过程将一个
2
×
2
2\times2
2×2的图片反池化为一个
4
×
4
4\times4
4×4的图片,这里涉及像素值应该放到哪一个位置的问题,放到哪一个位置由最大值池化中记录的最大值像素所在的位置,所在的索引。把最大值池化层中的最大值像素所在的位置传入到反池化层中,会根据从最大值池化中得到的索引将像素值放到对应的位置。所以最大值反池化层和池化层是类似的。唯一不同就是在
forward()
函数中要传入一个indices
,也就是反池化需要的索引值
- 参数:
kernel_size
:池化核尺寸stride
:步长padding
:填充个数
2、线性层(Linear Layer)
线性层又称全连接层,其每个神经元与上一层所有神经元相连 实现对前一层的线性组合,线性变换
PyTorch
实现:nn.Linear
- 功能: 对一维信号(向量)进行线性组合
- 参数:
in_features
:输入结点数;out_features
:输出结点数;bias
:是否需要偏置- 计算公式:
y = x W T + b i a s y=x W^{T}+bias y=xWT+bias
3、激活函数层(Activation Layer)
激活函数对特征进行非线性变换,赋予多层神经网络具有深度的意义,这是因为如果只有线性层,则神经网络中的多层的线性层等于一层线性层,如下图所示:
黄色为输入层
X
X
X,蓝色为隐藏层
H
1
H_1
H1和
H
2
H_2
H2,绿色为输出层
o
u
t
out
out,中间的三层变换为线性变换,记为
W
1
,
W
2
,
W
3
W_1,W_2,W_3
W1,W2,W3,则
O
u
t
p
u
t
=
H
2
×
W
3
=
H
1
×
W
2
×
W
3
=
X
×
(
W
1
×
W
2
×
W
3
)
=
X
×
W
\begin{aligned}Output =H_2 \times {W}_{3} =H_{1} \times {W}_{2} \times{W}_{3} ={X} \times({W}_{1} \times {W}_{2} \times {W}_{3} ) ={X} \times{W} \end{aligned}
Output=H2×W3=H1×W2×W3=X×(W1×W2×W3)=X×W
(1)nn.sigmoid
- 计算公式: y = 1 1 + e − x y=\frac{1}{1+e^{-x}} y=1+e−x1
- 梯度公式: y ′ = y × ( 1 − y ) {y}^{\prime}={y} \times(\mathbf{1}-{y}) y′=y×(1−y)
- 特性:
- 输出值在(0,1),符合概率;
- 导数范围是[0,0.25],容易导致梯度消失;
- 输出为非0均值,破坏数据分布;
(2)nn.tanh
- 计算公式: y = sin x cos x = e x − e − x e − + e − x = 2 1 + e − 2 x + 1 y=\frac{\sin x}{\cos x}=\frac{e^{x}-e^{-x}}{e^{-}+e^{-x}}=\frac{2}{1+e^{-2 x}}+1 y=cosxsinx=e−+e−xex−e−x=1+e−2x2+1
- 梯度公式: y ′ = 1 − y 2 y^{\prime}=1-y^{2} y′=1−y2
- 特性:
- 输出值在(-1,1),数据符合0均值;
- 导数范围是(0,1),易导致梯度消失;
(3)nn.ReLU
- 计算公式: y = max ( 0 , x ) y=\max (0, x) y=max(0,x)
- 梯度公式:
- 特性:
- 输出值均为正数,负半轴导致死神经元
- 导数是1,缓解梯度消失,但易引发梯度爆炸
- 改进:
nn.LeakyReLU
:引入负半轴斜率nn.PReLU
:引入可学习斜率nn.RReLU
:引入均匀分布上下限