1.概念
卷积层是用一个固定大小的矩形区去席卷原始数据,将原始数据分成一个个和卷积核大小相同的小块,然后将这些小块和卷积核相乘输出一个卷积值(注意这里是一个单独的值,不再是矩阵了)。
2.作用
特征提取
卷积的本质就是用卷积核的参数来提取原始数据的特征,通过矩阵点乘的运算,提取出和卷积核特征一致的值,如果卷积层有多个卷积核,则神经网络会自动学习卷积核的参数值,使得每个卷积核代表一个特征。
3.api
(1)一维
class torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1,padding=0,dilation=1,group=1,bias=true,padding_mode='zeros')
- in_channels(int) 输入信号的通道
- out_channels(int) 输出信号的通道
- stride(int or tuple) 步长 默认为1
- padding(int or tuple) 即为padding 默认为0
- dilation(int or tuple) 详细描述在这里 卷积核元素之间的间距 默认为1
- groups(int or tuple) 从输入通道到输出通道的阻塞连接数 默认为1
- bias(bool) 添加偏置 默认为True
(2)二维
class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1,padding=0,dilation=1,group=1,bias=true,padding_mode='zeros')
池化层
在卷积神经网络中池化过程是非常关键的,卷积操作后面拼接一个非线性变换操作+池化操作已经是标配。 下面就是池化的定义:
池化函数使用某一位置的相邻输出的"总体"统计特征来"代替"网络在"该位置"的输出
作用:
①改变图像大小减少计算
②克服图像变换(平移不变性,旋转不变性)
api:
最大值池化
torch.nn.MaxPool2d(kernel_size,
stride=None,
padding=0,
dilation=1,
return_indices=False,
ceil_mode=False)
池化参数 说明
kernel_size 最大池化的窗口大小(整数或数组)
stride 最大池化窗口移动的步长,默认值是kernel_size(整数或数组,正数)
padding 输入的每一条边补充0的层数(整数或数组,正数)
dilation 一个控制窗口中元素步幅的参数(整数或者数组,正数),默认为1
return_indices 如果为True,则返回输出最大值的索引,便于之后的torch.nn.MaxPool2d操作
ceil_mode 如果为True,计算输出信号大小时,会使用向上取整,默认是向下取整
maxpool = nn.MaxPool2d(2,stride=2) # 定义池化层
pool_out = maxpool(image_out) # 图像数据放进去做池化操作
平均池化
average_pool = nn.AvgPool2d(2,stride=2)
pool_out = average_pool(image_out)
自适应池化
adaverage_pool = nn.AdaptiveAvgPool2d(output_size=(100,100)) # 输出大小的尺寸指定为100*100
pool_out = adaverage_pool(image_out)
Normalization归一化
batch norm批处理化层
BN层往往用在深度神经网络的卷积层之后、激活层之前。其作用可以加快模型训练时的收敛速度,使得模型训练过程更加稳定,避免梯度爆炸或者梯度消失。并且起到一定的正则化作用,几乎代替了Dropout。
api:
torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True, device=None, dtype=None)
- num_features:通道数C。
- eps:归一化时加到分母上,防止分母过小导致数值计算不稳定。不用管这一项,一般用默认的就好。
- momentum:在track_running_stats为True时,momentum是训练过程中对均值和方差进行动量更新的动量参数;在track_running_stats为False时,momentum不起作用。
- affine:当为True时, � 和 � 参数是可学习的;反之,是不可学习的。
- track_running_stats:当为True时,在训练时会始终记录并更新(通过动量方法更新)全局的均值和方差,然后在测试时可以用这个均值和方差来归一化(为什么要这样做?你可以理解为这个均值和方差是所有训练样本的均值和方差,是全局的,对整个样本集的统计信息的描述更加准确一些);当为False时,不记录更新全局的均值和方差,这样的话,测试时用那个batch的测试数据本身的样本和方差来归一化。