一、池化层
池化运算:对信号进行‘收集‘并‘总结’, 类似于水池收集水资源
收集:多变少,总结:最大值/平均值
图像下采样
1、nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
功能:对二维信号(图像)进行最大值池化
参数:
kernel_size:池化核尺寸
stride:步长
padding:补边
dilation:池化核间隔大小
ceil_mode:尺寸向上取整
return_indices:记录池化像素索引,在进行池化上采样时使用已经记录的像素索引位置进行扩展
2、nn.AvgPool2d(kernel_size, stride=None, padding=0, count_include_pad=True, divisor_override=None, ceil_mode=False)
功能:对二维信号进行平均值池化
参数:
kernel_size:池化核尺寸
stride:步长
padding:补边
ceil_mode:尺寸向上取整
count_include_pad:是否将填充值用于计算
divisor_override:除法因子
图像上采样(反池化)
nn.MaxUnpool2d(kernel_size, stride=None, padding=0)
功能:对图像进行最大值池化上采样
主要参数:
kernel_size:池化核尺寸
stride:步长
padding:补边
注意:它和下采样池化唯一的区别就是需要在forward函数中添加像素索引,forward(self, input, indices, output_size=None)
二、线性层
线性层又称为全连接层,其每个神经元上一层所有神经元相连实现对前一层的线性组合,线性变换。
nn.Linear(in_features, out_features, bias=True)
功能:对一维信号进行线性组合
主要参数:
in_features:输入节点数
out_features:输出节点数
bias:是否需要偏置
计算公式:(x为输入,W为权值,T为转置,bias为偏置)
三、激活函数层
激活函数对特征进行非线性变换,赋予多层神经网络具有深度的意义
1、nn.Sgmoid
计算公式:
梯度公式:
特性:输出值在(0,1),符合概率;导数范围是[0,0.25],易导致梯度消失;输出为非0均值,破坏数据分布
下图为sigmoid函数的曲线图,蓝色表示输出,红色表示梯度
sigmoid梯度消失:由于梯度在[0,0.25]之间,叠加相乘时会越来越小导致梯度消失
2、nn.tanh
计算公式:
梯度公式:
特性:输出值在(-1,1),数据符合0均值;导数范围是(0,1),易导致梯度消失
下面是tanh的曲线图,蓝色表示输出,红色表示梯度,相比于sigmoid函数梯度消失不是很明显,但是对于深度较大的网络结构还是会发生梯度消失
3、nn.ReLu
计算公式:
特性:输出值均为正数,负半轴导致神经元致死;导数是1,缓解梯度消失,但是易引发梯度爆炸
下面是relu的曲线图,相比于前面两个,不会发生梯度消失,但是在叠加相乘时会越来越大,会发生梯度爆炸
对于上面的问题,对relu函数进行改进
改进relu
1、nn.LeakyReLu
参数:negative_slope:负半轴斜率
在负半轴增加一个斜率,使负半轴输出不再是0
2、nn.PReLu
参数:init:可学习斜率
3、nn.RReLu
参数:lower:均匀分布下限;upper:均匀分布上限
对负半轴随机采用一个斜率