今天开始介绍Pytorch的又一重点内容网络结构,这是自己搭建网络的前提,即搞清楚网络是由哪些基本结构组成的,识别各个网络。
网络结构是神经网络尤其指深度神经网络的基本结构,各种网络结构的有机组合就能完成神经网络的搭建。
常见的网络结构从输入到输出,一般有如下几种结构:
输入层、卷积层、改进层、全连接层等。下面逐一说明Pytorch的实现
#构建batch数据
data = torch.utils.data.DataLoader
module.train()
#数据放入模型中
output = module(data)
输出维度是自定义的,每个维度的图尺寸是需要计算的公式如下W2 = [(W1-K+2P)/S]+1
小核、分组、空洞都有减参的效果
代码如下(示例):
假定输入为 (32, 28, 28),32通道,28*28大小
nn.Conv2d(
in_channels=32, # 输入维度
out_channels=64, # 输出要多少个特征图,可自己设定
kernel_size=5, # 卷积核大小,一般3、5、7。奇数为了能中心对齐
stride=1, # 步长即滑动窗口
padding=2, # 边缘填充,如果希望卷积后大小跟原来一样,需要设置padding=(kernel_size-1)/2 前提 stride=1
dilation=1, # 空洞卷积默认为1,即不进行空洞
groups=1, # 分组卷积,默认为1,即只分1组,不进行拆分
bias= True # 偏置,默认添加偏置
), # 输出的特征图为 (64, 28, 28)
改进层不是一种操作的简称,而是对卷积之后的弊端改进的各种操作的统称,非必须,视情况选择使用。
分为以下几种操作:
非线性化、减参、缓解过拟合、缓解梯度消失或不收敛
下面分情况讨论
目的是:事物不是线性发展的,即不可能一线到底,神经网络进行智能拟合就必须是非线性的,卷积操作是线性的加减乘除,因此需要卷积之后加入非线性变化也成激活函数
Pytorch中有众多激活函数API,介绍主要的几种
import torch.nn as nn
nn.Conv2d()#在卷积之后紧跟激活函数
nn.ReLU()#最常用,以下三选一
nn.Sigmod()
nn.LeakyReLU()
提示:如果在卷积的操作中使用了减参手段,那么卷积之后可以省略再减参
目的是:过多的参数是的神经网络很难训练,因此在保证训练精度的前提下,可以现在Pooling(c池化)减参
Pytorch中有众多池化API,介绍主要的几种
import torch.nn as nn
nn.Conv2d()#在卷积之后紧跟激活函数
nn.ReLU()#最常用
nn.MaxPool2d()#以下2选一
nn.AvgPool2d()
目的是:神经网络在训练的数据集上表现很好,在测试集上表现很差,我们的模型在训练集上拟合事物的时候拟合太过,对测试集上的离群点很难去接近,因此我们要缓解过拟合,当然我们现在只在模型构建层面来讨论缓解过拟合的方法。
Pytorch中缓解过拟合的API,主要介绍的是Dropout
import torch.nn as nn
nn.Dropout2d(0.5)#以0.5的概率关闭神经元,以期使其它神经元能挑更多担子
目的是:神经网络的层数不断加深,在训练的过程会出现训练不收敛情况,浅层参数的微弱变化经过多层线性变换与激活函数后会被放大,改变了每一层的输入分布,造成深层的网络需要不断调整以适应这些分布变化,最终导致模型难以训练收敛。将卷积层的输入分布归一化,以解决此类问题
Pytorch中缓解梯度消失的API,介绍主要的几种
>>> from torch import nn
# 使用BN层需要传入一个参数为num_features,即特征的通道数
>>> bn = nn.BatchNorm2d(64)
# eps为公式中的 є, momentum为均值方差的动量,affine为添加可学习参数
>>> bn
BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
这一层主要通过全连接的方式,将卷积后的数据同目标数据做映射转化,突出特点是连接紧密,参数非常多,占到全部参数的3-6成。
tensor转为1维向量,也就固定了其上下游通道数,不利于图像尺度的扩展,基本不在加该层。
torch.nn.Linear(in, out)
以上就是今天要讲的内容,本文简单介绍了神经网络的各种结构层的使用,希望大家能够准确识别各种模型的每一层。接下来我们来一起看看如何将各种层组合在一起搭建成模型。