卷积神经网络由一个或多个卷积层和顶端的全连通层组成,同时也包括关联权重和池化层。与其他深度学习结构相比,卷积神经网络在图像和语音识别方面能够给出更好的结果,且考量的参数更少。
卷积神经网络的运作,以图像识别举例: 神经网络有输入输出值,当输入值是图片时,实际输入的并不是我们肉眼看到的图案,而是只能被计算机识别的一堆数字。卷积神经网络有一个批量过滤器,持续不断地在图片上滚动收集图片里的信息,每一次收集的时候都只是收集一小块像素区域,然后把收集来的信息进行整理,这时候整理出来的信息有了一些实际上的呈现。这时就不再是对每个像素的输入信息做处理,而是对图片上每一小块像素区域进行处理,加强了图片信息的连续性,使得神经网络能看到图形而非一个点。
下面是来自官方文档的图片:
定义网络
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:表示是否返回最大值的下标,默认为
False
- ceil_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-5
- momentum:用于 running_mean 和 running_var 计算的值;对于累积移动平均值(即简单平均值),可以设置为“无”。 默认值为 0.1
- affine:当设置为
True
时,该模块具有可学习的仿射参数。 默认为True
- track_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]
防止过拟合
torch.nn.Dropout(p=0.5, inplace=False)
- p:将元素置0的概率。默认值:0.5
- in-place:若设置为True,会在原地执行操作。默认值:False
随机将输入张量中部分元素设置为0。对于每次前向调用,被置0的元素都是随机的。
具体实例可以看这篇文章:PyTorch手写数字识别(MNIST数据集)
转载:https://blog.csdn.net/weixin_44613063/article/details/101872870
查看评论