PyTorch构建卷积神经网络

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44613063/article/details/101872870

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

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

下面是来自官方文档的图片:
在这里插入图片描述


定义网络

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]

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


防止过拟合

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

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


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

猜你喜欢

转载自blog.csdn.net/weixin_44613063/article/details/101872870
今日推荐