中山精品网站建设价位wordpress 评论ip拉黑

当前位置: 首页 > news >正文

中山精品网站建设价位,wordpress 评论ip拉黑,ftp制作网站,大连网站建设怎么做专栏#xff1a;神经网络复现目录 本章介绍的是现代神经网络的结构和复现#xff0c;包括深度卷积神经网络#xff08;AlexNet#xff09;#xff0c;VGG#xff0c;NiN#xff0c;GoogleNet#xff0c;残差网络#xff08;ResNet#xff09;#xff0c;稠密连接网络…专栏神经网络复现目录 本章介绍的是现代神经网络的结构和复现包括深度卷积神经网络AlexNetVGGNiNGoogleNet残差网络ResNet稠密连接网络DenseNet。 文章部分文字和代码来自《动手学深度学习》 文章目录使用块的网络(VGG)VGG块定义实现VGG16模型设计实现利用VGG16进行CIFAR10分类数据集超参数优化器损失函数训练使用块的网络(VGG) VGG是一种深度卷积神经网络由牛津大学视觉几何组Visual Geometry Group在2014年提出。它是由多个卷积层和池化层组成的深度神经网络具有很强的图像分类能力特别是在图像识别领域取得了很好的成果。 VGG的特点在于它使用相对较小的卷积核3x3但是通过叠加多个卷积层和池化层增加了网络的深度从而达到更好的图像分类性能。VGG网络包含了多个版本以卷积层数目为标志如VGG16和VGG19等其中VGG16和VGG19是最著名的两个版本。 VGG网络的设计非常简单和规整容易理解和实现因此也成为了很多深度学习新手的入门模型。 下图为VGG的六个版本比较实用的是VGG16和VGG19本文以VGG16为例子进行讲解
VGG块 定义 VGG块是VGG网络中的一个基本组成单元由若干个卷积层和池化层组成通常用于提取输入图像的特征。每个VGG块都由连续的1或2个卷积层和一个最大池化层组成。其中卷积层的卷积核大小都是3x3而池化层的窗口大小通常是2x2。在每个VGG块中卷积层的输出通道数都相同可以通过超参数进行控制。 具体来说假设一个VGG块由k个卷积层和一个池化层组成输入为xxx则该块的输出可以表示为 VGG(x)Pool(convk(convk−1(⋯conv1(x)))).\text{VGG}(x) \text{Pool}(\text{conv}k(\text{conv}{k-1}(\cdots\text{conv}_1(x)))).VGG(x)Pool(convk(convk−1(⋯conv1​(x)))). 其中convi(⋅)\text{conv}_i(\cdot)convi​(⋅)表示第iii个卷积层Pool(⋅)\text{Pool}(\cdot)Pool(⋅)表示池化层。在VGG块中每个卷积层都会使用ReLU激活函数进行非线性变换而最大池化层则用于下采样和特征压缩。 在VGG网络中通常通过叠加多个VGG块来构建网络结构。通过增加VGG块的数量可以增加网络的深度和宽度从而提高网络的表达能力和泛化性能。 实现 self.conv1nn.Sequential(nn.Conv2d(in_channels3,out_channels64,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.Conv2d(in_channels64,out_channels64,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2,stride2),)inplaceTrue 表示对于输入的张量进行原地操作即直接对原始的输入张量进行修改而不是创建一个新的张量。这样做可以节省内存但会覆盖原始的输入张量可能会对后续的计算产生影响。因此当我们需要保留原始的输入张量时可以将 inplace 参数设置为 False。 VGG16 模型设计 VGG16是一个卷积神经网络模型包含13个卷积层、5个池化层和3个全连接层是由牛津大学计算机视觉组Visual Geometry Group在2014年提出的模型具有较好的图像识别表现。 VGG16模型的架构如下 输入层输入图像的大小为224x224x3。 VGG块1 卷积层1使用64个3x3大小的卷积核进行卷积操作得到64张大小为224x224的特征图。采用SAME填充步长为1。然后再通过ReLU非线性激活函数进行激活。 卷积层2使用64个3x3大小的卷积核进行卷积操作得到64张大小为224x224的特征图。采用SAME填充步长为1。然后再通过ReLU非线性激活函数进行激活。 池化层1使用2x2的最大池化操作将64张大小为224x224的特征图缩小为64张大小为112x112的特征图。采用SAME填充步长为2。 VGG块2 卷积层3使用128个3x3大小的卷积核进行卷积操作得到128张大小为112x112的特征图。采用SAME填充步长为1。然后再通过ReLU非线性激活函数进行激活。 卷积层4使用128个3x3大小的卷积核进行卷积操作得到128张大小为112x112的特征图。采用SAME填充步长为1。然后再通过ReLU非线性激活函数进行激活。 池化层2使用2x2的最大池化操作将128张大小为112x112的特征图缩小为128张大小为56x56的特征图。采用SAME填充步长为2。 VGG块3 卷积层5使用256个3x3大小的卷积核进行卷积操作得到256张大小为56x56的特征图。采用SAME填充步长为1。然后再通过ReLU非线性激活函数进行激活。 卷积层6使用256个3x3大小的卷积核进行卷积操作得到256张大小为56x56的特征图。采用SAME填充步长为1。然后再通过ReLU非线性激活函数进行激活。 卷积层7使用256个3x3大小的卷积核进行卷积操作得到256张大小为56x56的特征图。采用SAME填充步长为1。然后再通过ReLU非线性激活函数进行激活。 池化层3使用2x2的最大池化操作将256张大小为56x56的特征图缩小为256张大小为28x28的特征图。采用SAME填充步长为2。 VGG块4 卷积层8-10使用512个3x3大小的卷积核进行卷积操作得到512张大小为28x28的特征图。采用SAME填充步长为1。然后再通过ReLU非线性激活函数进行激活。 池化层4使用2x2的最大池化操作将512张大小为28x28的特征图缩小为512张大小为14x14的特征图。采用SAME填充步长为2。 VGG块5 卷积层11-13使用512个3x3大小的卷积核进行卷积操作得到512张大小为14x14的特征图。采用SAME填充步长为1。然后再通过ReLU非线性激活函数进行激活。 池化层5使用2x2的最大池化操作将512张大小为14x14的特征图缩小为512张大小为7x7的特征图。采用SAME填充步长为2。 全连接层 3个全连接层第1、2个都有4096个输出通道第3个全连接层则有1000个输出通道。 实现 class VGG16(nn.Module):def init(self):super(VGG16,self).init()self.conv1nn.Sequential(nn.Conv2d(in_channels3,out_channels64,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.Conv2d(in_channels64,out_channels64,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2,stride2),)self.conv2nn.Sequential(nn.Conv2d(in_channels64,out_channels128,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.Conv2d(in_channels128,out_channels128,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2,stride2),)self.conv3nn.Sequential(nn.Conv2d(in_channels128,out_channels256,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.Conv2d(in_channels256,out_channels256,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.Conv2d(in_channels256,out_channels256,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2,stride2),)self.conv4nn.Sequential(nn.Conv2d(in_channels256,out_channels512,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.Conv2d(in_channels512,out_channels512,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.Conv2d(in_channels512,out_channels512,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2,stride2),)self.conv5nn.Sequential(nn.Conv2d(in_channels512,out_channels512,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.Conv2d(in_channels512,out_channels512,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.Conv2d(in_channels512,out_channels512,kernel_size3,padding1,stride1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2,stride2),)self.featurenn.Sequential(self.conv1,self.conv2,self.conv3,self.conv4,self.conv5,)self.flattennn.Flatten()self.fcnn.Sequential(nn.Linear(512*7*7,4096),nn.ReLU(inplaceTrue),nn.Dropout(0.4),nn.Linear(4096,4096),nn.ReLU(inplaceTrue),nn.Dropout(0.4),nn.Linear(4096,1000),#nn.Softmax(10))def forward(self,x):xself.feature(x)# xself.flatten(x)x x.view(x.size(0), -1)xself.fc(x)return x 查看结构 vgg VGG16() print(vgg) xtorch.rand(1,3,224,224) yvgg(x) print(y.shape)利用VGG16进行CIFAR10分类 import torch.nn as nn import torch import torchvisionif(torch.cuda.is_available()):device torch.device(cuda)print(使用GPU训练中{}.format(torch.cuda.get_device_name())) else:device torch.device(cpu)print(使用CPU训练) 数据集

transform的创建compose方法

from torchvision import transforms def get_dataloader_workers(): #save使用4个进程来读取数据return 4def load_data_cifar10(batch_size, resizeNone): #savetrans [transforms.ToTensor()]if resize:trans.insert(0, transforms.Resize(resize))trans transforms.Compose(trans)mnist_train torchvision.datasets.CIFAR10(root../data, trainTrue, transformtrans, downloadTrue)mnist_test torchvision.datasets.CIFAR10(root../data, trainFalse, transformtrans, downloadTrue)return (torch.utils.data.DataLoader(mnist_train, batch_size, shuffleTrue,num_workersget_dataloader_workers()),torch.utils.data.DataLoader(mnist_test, batch_size, shuffleFalse,num_workersget_dataloader_workers())) batch_size4 train_iter, test_iter load_data_cifar10(batch_size,resize224) 超参数优化器损失函数 from torch import optim netVGG16() lr0.001 optimizeroptim.SGD(net.parameters(),lrlr,momentum0.9) lossnn.CrossEntropyLoss() epochs10训练 def train(net,train_iter,test_iter,num_epochs, lr, device):def init_weights(m):if type(m) nn.Linear or type(m) nn.Conv2d:nn.init.xavieruniform(m.weight)net.apply(init_weights)print(training on, device)net.to(device)for epoch in range(num_epochs):net.train()train_step 0for i, (X, y) in enumerate(train_iter):optimizer.zero_grad()X, y X.to(device), y.to(device)y_hat net(X)lloss(y_hat,y)l.backward()optimizer.step()train_step1if(train_step%500):#每训练一百组输出一次损失print(第{}轮的第{}次训练的loss:{}.format((epoch1),train_step,l.item()))