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

avatar
作者
筋斗云
阅读量:0

线性层和其它层的介绍

教学视频链接:神经网络-线性层及其他层介绍_哔哩哔哩_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真的太强大了:

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

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!