3_神经网络的搭建(二)

线性层和其它层的介绍

教学视频链接:神经网络-线性层及其他层介绍_哔哩哔哩_bilibili

 正则化层(Normalization Layers)

torch.nn 中,Normalization Layers 主要用于对输入数据进行标准化或归一化,以帮助模型的训练和收敛。这些层通常用于深度学习模型中,特别是在卷积神经网络(CNN)和递归神经网络(RNN)等结构中。

优点:可以加快神经网络的训练速度。

这个使用得不是很多。还是放一个官方网址:

BatchNorm2d — PyTorch 2.4 documentation

torch.nn.BatchNorm2d(num_featureseps=1e-05momentum=0.1affine=Truetrack_running_stats=Truedevice=Nonedtype=None

在它的众多参数中,一般只有num_features需要我们手动设置,其他默认即可。 

# With Learnable Parameters
m = nn.BatchNorm2d(100)


# Without Learnable Parameters(第一个参数与数据集的C相同)
m = nn.BatchNorm2d(100, affine=False)

#以下四个参数分别是(N,C,H,W)
input = torch.randn(20, 100, 35, 45)
output = m(input)

循环层(Recurrent Layers)

Recurrent Layers(循环层)指的是用于处理序列数据的神经网络层,主要是循环神经网络(RNN)及其变体。这些层允许模型在处理序列数据时保持状态或记忆,以便有效地捕捉序列中的长期依赖关系。

这个实际上是一种特定的层,用到的地方比较少。

笔者还没有学到循环神经网络,就先略过了,什么时候需要再来补。

变换层(Transform Layers)

Transform Layers(变换层)通常指的是一类用于对输入数据进行变换或映射的层次结构,它们在神经网络中起到了不同的作用和功能。这些层有时候也可以称为逐元素操作层或者非线性激活函数层,它们的设计目的是为了引入模型需要的非线性特性。

这个也使用得比较少。

线性层(Linear Layers)

Linear Layers(线性层)在 PyTorch 中属于神经网络的基本组成部分之一,也称为全连接层或仿射变换层。它们的作用是将输入张量与权重矩阵相乘,并加上一个偏置向量,从而实现对输入数据的线性变换。

这个使用的很广泛。官方网址:Linear — PyTorch 2.4 documentation

torch.nn.Linear(in_featuresout_featuresbias=Truedevice=Nonedtype=None

 对照着上面的函数基本介绍和上面所示的这幅图,我们来简单讲解一下函数的参数都是什么。

从图上不难看出,左中右分别是输入层、中间层(隐藏层)和输出层。

  • in_features:指输入层的特征个数。即图中的d。
  • out_features:指中间层的特征个数。即图中的L。
  • bias:即偏置项,这个参数用于说明,在神经网络训练过程中,是否要加入偏置项b。

from torch import nn
import torch
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset=torchvision.datasets.CIFAR10("../dataset",train=False,download=True,transform=torchvision.transforms.ToTensor())
dataloader=DataLoader(dataset,batch_size=64,drop_last=True)
class MyNn(nn.Module):
    def __init__(self) :
        super().__init__()
        self.lenear1=nn.Linear(196608,10)

    def forward(self,input):
        return self.lenear1(input)

mynn=MyNn()
for data in dataloader:
    imgs,targets=data
    
    output=torch.reshape(imgs,(1,1,1,-1))
    print(output.shape)
    output=mynn(output)
    print(output.shape)

    



随机失活层(Dropout Layers)

Dropout 是一种常用的正则化技术,主要用于减少神经网络模型的过拟合现象。 使用这个,会随机地把输入数据中的某些元素置为0,我们可以指定随机的概率,由此来防止过拟合。

搭建小实战和sequencial的使用

先把Sequrecial的官方网址放在这里:

Sequential — PyTorch 2.4 documentation

 CIFAR-10 简介

我们之前有一直使用CIFAR-10数据集,那么这个小实战就还是使用这个来进行分类。CIFAR-10中的‘10’代表的是10个类别 。具体介绍可以参考这篇文章:

【神经网络与深度学习】CIFAR10数据集介绍,并使用卷积神经网络训练图像分类模型——[附完整训练代码]_cifar-10-CSDN博客

 下图是训练该分类模型的示例图。可以看出它的运作方式就是先卷积再池化再卷积再池化......最后摊平成一维数据再输出。

其中我要单独拿出来说的是第一步卷积的过程,图上可以看到,输入(Input)是3@32*32,这个的意思其实是3通道,每通道32*32像素(也就是32*32的数据),而经过第一次卷积后,它的通道数增加了:32@32*32。为什么会这样?其实在于它使用的卷积核,图中只标明了这是一个5*5的卷积核,并没有说它的通道数,实际上,这里应该是一个三通道的5*5卷积核,在第一次卷积处理过程中,这样的卷积核一共有32个。每一个卷积核做运算后得到一通道的32*32的输出,一共32个输出“平面”,这才使得第一次卷积的结果成为了32@32*32。

今天我们就来实现这个模型。

模型实现

这一部分要做的笔记就太多了。

把视频放在这里:神经网络-搭建小实战和Sequential的使用_哔哩哔哩_bilibili

 再把图放在这里一遍:

 在搭建网络过程中,有一些参数是涉及到计算的。

比如说刚刚说过的卷积层,再把卷积函数放一下:

torch.nn.Conv2d(in_channelsout_channelskernel_sizestride=1padding=0dilation=1,

 groups=1bias=Truepadding_mode='zeros'device=Nonedtype=None)

可以看到,我们需要设置的参数有:in_channels,out_channels,kernel_size等等。我们需要注意官网上所给出的计算公式:

 其他几个卷积层的计算公式类似,建议看不懂过程的去看视频。

由此我们可以得出所需要设置的参数,开始搭建网络了。

from torch import nn
import torch
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
#dataset=torchvision.datasets.CIFAR10("../dataset",train=False,download=True,transform=torchvision.transforms.ToTensor())
#dataloader=DataLoader(dataset,batch_size=64,drop_last=True)
class MyNn(nn.Module):
    def __init__(self) :
        super().__init__()
        # self.conv1=nn.Conv2d(3,32,5,padding=2)
        # self.maxpool1=nn.MaxPool2d(2)
        # self.conv2=nn.Conv2d(32,32,5,padding=2)
        # self.maxpool2=nn.MaxPool2d(2)
        # self.conv3=nn.Conv2d(32,64,5,padding=2)
        # self.maxpool3=nn.MaxPool2d(2)
        # self.flatten=nn.Flatten()
        # self.linear1=nn.Linear(1024,64)
        # self.linear2=nn.Linear(64,10)
        '''使用Sequential可以简化代码'''
        self.model1=nn.Sequential(
            nn.Conv2d(3,32,5,padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32,32,5,padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32,64,5,padding=2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(1024,64),
            nn.Linear(64,10)
        )


    def forward(self,x):
        # x=self.conv1(x)
        # x=self.maxpool1(x)
        # x=self.conv2(x)
        # x=self.maxpool2(x)
        # x=self.conv3(x)
        # x=self.maxpool3(x)
        # x=self.flatten(x)
        # x=self.linear1(x)
        # x=self.linear2(x)
        x=self.model1(x)
        return x

'''
检验网络是否设置正确:
'''
mynn=MyNn()
input=torch.ones((64,3,32,32))
output=mynn(input)
writer=SummaryWriter('Logs')
writer.add_graph(mynn,input)
writer.close()

最后想说的是writer.add_graph()的使用,不得不说tensorboard真的太强大了:

 我们可以使用它来查询训练的每一步过程。

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值