PyTorch构建卷积神经网络

mac2022-06-30  103

卷积神经网络由一个或多个卷积层和顶端的全连通层组成,同时也包括关联权重和池化层。与其他深度学习结构相比,卷积神经网络在图像和语音识别方面能够给出更好的结果,且考量的参数更少。

卷积神经网络的运作,以图像识别举例: 神经网络有输入输出值,当输入值是图片时,实际输入的并不是我们肉眼看到的图案,而是只能被计算机识别的一堆数字。卷积神经网络有一个批量过滤器,持续不断地在图片上滚动收集图片里的信息,每一次收集的时候都只是收集一小块像素区域,然后把收集来的信息进行整理,这时候整理出来的信息有了一些实际上的呈现。这时就不再是对每个像素的输入信息做处理,而是对图片上每一小块像素区域进行处理,加强了图片信息的连续性,使得神经网络能看到图形而非一个点。

下面是来自官方文档的图片:


定义网络

class MyNet(nn.Module): # 构造函数,初始化 def __init__(self): super(MyNet, self).__init__() # 此处定义自己的网络 def forward(self,x): # 此处定义自己的前向传播方式 return x

声明一个类,并继承自 nn.Module

定义构造函数,例如用于分类的网络

初始化方法(使用父类的方法即可)

最后定义自己的前向传播函数


卷积层

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True) in_channels:输入通道数(深度)out_channels:输出通道数(深度)kernel_size:滤波器(卷积核)大小,宽和高相等的卷积核可以用一个数字表示,例如:kernel_size=2;否则用不同数字表示,例如 kernel_size=(4,9)stride:表示滤波器滑动的步长padding:是否进行零填充,padding=0 表示四周不进行零填充,padding=1 表示四周进行1个像素点的零填充bias:默认为 True,表示使用偏置groups:groups=1 表示所有输入输出是相关联的;groups=n 表示输入输出通道数(深度)被分割为 n 份,并分别对应,且需要被 groups 整除dilation:卷积对输入的空间间隔,默认为 True

举个例子:

class MyNet(nn.Module): def __init__(self): super(MyNet, self).__init__() self.conv1 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5, padding=1) def forward(self,x): out = self.conv1(x) return out

构建一个输入通道为6,输出通道为16,卷积核大小为5x5,四周进行1个像素点的零填充的conv1层


池化层

最大值池化 nn.MaxPool2d() 和均值池化 nn.AvgPool2d()

torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False) torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True) kernel_size、stride、padding、dilation与卷积层定义一致return_indices:表示是否返回最大值的下标,默认为 Falseceil_mode:默认为 False,即不使用方格代替层结构count_include_pad:默认为 True,表示包含零填充

举个例子:

class MyNet(nn.Module): def __init__(self): super(MyNet, self).__init__() self.conv1 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5, padding=1) self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) def forward(self,x): #定义自己的前向传播方式 out = self.conv1(x) out = self.pool1(out) return out

构建一个卷积核大小为2x2,步长为2的pool1层


批标准化层(加快收敛速度)

torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True) num_features:输入通道数(深度)eps:为数值稳定性而添加到分母的值, 默认值为 1e-5momentum:用于 running_mean 和 running_var 计算的值;对于累积移动平均值(即简单平均值),可以设置为“无”。 默认值为 0.1affine:当设置为 True 时,该模块具有可学习的仿射参数。 默认为 Truetrack_running_stats:当设置为 True 时,该模块跟踪运行的均值和方差,当设置为 False 时,该模块不跟踪这样的统计数据,并且总是在训练和评估模式。 默认为 True

举个例子:

class MyNet(nn.Module): def __init__(self): super(MyNet, self).__init__() self.conv1 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5, padding=1) self.BN1 = nn.BatchNorm2d(16) self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) def forward(self,x): out = self.conv1(x) out = self.BN1(out) out = self.pool1(out) return out

构建一个输入通道为16的BN1层,与卷积层输出通道数16对应


激活函数(非线性化)

常用的激活函数:

import torch.nn.functional as F F.relu() F.sigmoid() F.tanh() F.softplus()

全连接层

torch.nn.Linear(in_features, out_features, bias=True) in_features:上层网络神经元的个数out_features:该网络层神经元的个数bias:网络层是否有偏置,默认为True,且维度为[out_features]

y = x A T + b y = xA^T+b y=xAT+b


防止过拟合

torch.nn.Dropout(p=0.5, inplace=False) p:将元素置0的概率。默认值:0.5in-place:若设置为True,会在原地执行操作。默认值:False

随机将输入张量中部分元素设置为0。对于每次前向调用,被置0的元素都是随机的。


具体实例可以看这篇文章:PyTorch手写数字识别(MNIST数据集)

最新回复(0)