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

南昌网站建设服务器巩义网站推广优化

南昌网站建设服务器,巩义网站推广优化,深圳制作app,中视频自媒体账号注册下载专栏#xff1a;神经网络复现目录 本章介绍的是现代神经网络的结构和复现#xff0c;包括深度卷积神经网络#xff08;AlexNet#xff09;#xff0c;VGG#xff0c;NiN#xff0c;GoogleNet#xff0c;残差网络#xff08;ResNet#xff09;#xff0c;稠密连接网络…专栏神经网络复现目录 本章介绍的是现代神经网络的结构和复现包括深度卷积神经网络AlexNetVGGNiNGoogleNet残差网络ResNet稠密连接网络DenseNet。 文章部分文字和代码来自《动手学深度学习》 文章目录残差网络ResNet恒等变换跳跃连接残差块ResNet模型结构实现残差块ResNet利用ResNet50进行CIFAR10分类数据集损失函数优化器训练可视化残差网络ResNet 残差网络Residual Network简称 ResNet是由微软研究院于 2015 年提出的一种深度卷积神经网络。它的主要特点是在网络中添加了“残差块”Residual Block有效地解决了深层网络的梯度消失和梯度爆炸问题从而使得更深的网络结构可以训练得更好。 ResNet 的核心思想是学习残差即在训练过程中让神经网络学习一个残差映射该映射将输入直接映射到输出即 F(x)H(x)−xF(x) H(x) - xF(x)H(x)−x。这里 xxx 表示残差块的输入H(x)H(x)H(x) 表示残差块的输出。在传统的网络结构中网络的每一层都需要学习一个映射函数即 H(x)H(x)H(x)但这种方法会出现梯度消失和梯度爆炸问题。而使用残差块可以使网络只学习残差部分即 F(x)F(x)F(x)这使得训练更加容易并且可以构建更深的网络结构。 ResNet 的基本结构是残差块其中包含了跨层连接skip connection的机制。跨层连接可以将输入直接传递到输出端从而避免了梯度消失问题同时也减轻了梯度爆炸问题。除了跨层连接之外ResNet 还采用了批量归一化Batch Normalization和池化操作等技巧来提高网络的训练效率和泛化能力。 总体上来说ResNet 是一种十分有效的深度神经网络结构其在许多计算机视觉任务上都取得了优异的表现例如图像分类、物体检测和语义分割等 恒等变换 恒等变换Identity Transformation指的是一种变换使得输入和输出完全相同。在数学上恒等变换可以用一个函数f(x) x来表示。 在深度学习中恒等变换通常用于残差块Residual Block中。在残差块中恒等变换被用作跳跃连接Shortcut Connection将输入直接传递给输出这样可以加速梯度的传播和网络的训练。 举个例子假设有一个残差块的输入x和输出y它们的维度都为d。那么该残差块可以表示为 y f(x) x 其中f(x)是残差块的变换它会对输入进行处理。而x则是恒等变换它使得输入可以直接传递给输出。通过这样的设计残差块可以保留输入中的有用信息同时仍然能够对输入进行一定程度的处理从而提高网络的性能。 跳跃连接 跳跃连接Skip Connection也称为残差连接Residual Connection是深度神经网络中的一种连接方式用于解决网络训练过程中梯度消失问题。 在跳跃连接中网络的某一层的输出不仅会传递给下一层进行计算还会直接传递到距离当前层较远的层。这样可以使得网络中的信息能够更快地传递和共享同时也可以减轻梯度消失的问题使得训练过程更加稳定。 在ResNet网络中跳跃连接被用于将网络的输入直接连接到卷积层的输出上形成一个残差块。这样网络的前向传播就变成了从输入到输出的“路径”加上一个残差块的“跳跃”即“shortcut”。跳跃连接的使用大大改善了ResNet的性能使得它在ImageNet图像分类等任务中取得了非常优秀的表现。 残差块 残差块Residual Block是深度学习中常用的一种模块可以用来构建深度神经网络。残差块的主要作用是使得神经网络的训练更加容易并且能够加速神经网络的收敛。 让我们聚焦于神经网络局部如图所示假设我们的原始输入为x而希望学出的理想映射为f(x)作为上方激活函数的输入左图虚线框中的部分需要直接拟合出该映射f(x)而右图虚线框中的部分则需要拟合出残差映射f(x)-x。残差映射在现实中往往更容易优化。 以本节开头提到的恒等映射作为我们希望学出的理想映射f(x),我们只需将图中右图虚线框内上方的加权运算如仿射的权重和偏置参数设成0那么f(x)即为恒等映射实际中当理想映射fx极接近于恒等映射时残差映射也易于捕捉恒等映射的细微波动。 在深度神经网络中很容易出现梯度消失或梯度爆炸的问题这会导致深度神经网络的训练非常困难。残差块的设计可以缓解这个问题。残差块的主要思想是在网络中增加一条跳跃连接Shortcut Connection这条连接可以让输入直接跳过一些层从而更加容易地传递梯度。具体来说残差块可以分为如下几个步骤 输入x经过一个卷积层得到特征图y1。将y1经过一个Batch Normalization层和ReLU激活函数。将y1再次经过一个卷积层得到特征图y2。将y2经过一个Batch Normalization层。将输入x和y2相加得到残差特征图y3。将y3再经过一个ReLU激活函数。 在这个过程中输入x可以看做是一种残差因为它会直接和特征图y2相加。这个残差块的设计可以让网络更容易地学习残差从而更好地拟合训练数据。此外残差块也可以增加网络的深度从而提升网络的效果。 ResNet模型 结构 ResNet原文中给出了几种基本的网络结构配置本文以ResNet50为例。 ResNet50结构详解 输入层Input Layer输入图像的大小为224 x 224 x 3。 卷积层Convolution Layer7x7的卷积核步长为2输出通道为64padding为3。 标准化层Batch Normalization Layer对每个通道的输出做标准化处理包括均值和方差。 激活函数Activation Layer使用ReLU激活函数。 最大池化层Max Pooling Layer3x3的池化核步长为2padding为1对每个通道的输出取最大值。 残差块Residual Block1包含3个卷积层和标准化层。第一个卷积层的卷积核为1x1输出通道为64第二个卷积层的卷积核为3x3输出通道为64第三个卷积层的卷积核为1x1输出通道为256因为残差块的输入和输出通道数不同需要用1x1的卷积核进行通道变换。 残差块Residual Block2包含4个卷积层和标准化层。第一个卷积层的卷积核为1x1输出通道为128第二个卷积层的卷积核为3x3输出通道为128第三个卷积层的卷积核为1x1输出通道为512。 残差块Residual Block3包含6个卷积层和标准化层。第一个卷积层的卷积核为1x1输出通道为256第二个卷积层的卷积核为3x3输出通道为256第三个卷积层的卷积核为1x1输出通道为1024。 残差块Residual Block4包含3个卷积层和标准化层。第一个卷积层的卷积核为1x1输出通道为512第二个卷积层的卷积核为3x3输出通道为512第三个卷积层的卷积核为1x1输出通道为2048。 平均池化层Average Pooling Layer使用全局平均池化将输出的特征图转化为向量。 全连接层Fully Connected Layer将向量连接到最终的输出层该层包含1000个神经元每个神经元对应于一个类别表示图像属于该类别的概率。 Softmax层Softmax Layer使用softmax函数将全连接层的输出转化为概率分布每个类别的概率为0到1之间的实数概率之和为1。 总结ResNet50网络结构由多个残差块组成每个残差块内部包含多个卷积层和标准化层。通过使用残差学习的方法ResNet50网络能够在训练深度神经网络时解决梯度消失和梯度爆炸的问题同时在图像分类等任务中表现出色。 实现 残差块 import torch.nn as nn import torch.onnxclass Residual(nn.Module):def __init__(self, in_channels, channels, stride, downsampleNone):super(Residual, self).__init__()# 1x1的卷积降维操作self.conv1 nn.Conv2d(in_channelsin_channels, out_channelschannels, kernel_size(1, 1),biasFalse)self.bn1 nn.BatchNorm2d(channels)# 3x3的卷积提取特征操作self.conv2 nn.Conv2d(in_channelschannels, out_channelschannels, kernel_size(3, 3),stridestride,padding1,biasFalse)self.bn2 nn.BatchNorm2d(channels)# 1x1的卷积升维操作self.conv3 nn.Conv2d(in_channelschannels, out_channelschannels * 4, kernel_size(1, 1),biasFalse)self.bn3 nn.BatchNorm2d(channels * 4)self.relu nn.ReLU(inplaceTrue)self.downsample downsample# 4组卷积层的头一层网络会做一次降采样目的是使out和identity维度一致可以做加法if self.downsample is not None:self.dconv nn.Conv2d(in_channels, channels * 4, stridestride, kernel_size(1, 1), biasFalse)self.dbn nn.BatchNorm2d(channels * 4)def forward(self, x):identity xout self.conv1(x)out self.bn1(out)out self.relu(out)out self.conv2(out)out self.bn2(out)out self.relu(out)out self.conv3(out)out self.bn3(out)if self.downsample is not None:identity self.dconv(identity)identity self.dbn(identity)out identityout self.relu(out)return outResNet class Resnet50(nn.Module):def __init__(self, num_classes):super(Resnet50, self).__init__()self.conv1 nn.Conv2d(3, 64, kernel_size(7, 7), stride2, padding3, biasFalse)self.bn1 nn.BatchNorm2d(64)self.relu1 nn.ReLU(inplaceTrue)self.maxpool1 nn.MaxPool2d(kernel_size3, stride2, padding1)# 对应第1组网络层3*Resnet的基本结构self.conv64_1 Residual(64, 64, stride1, downsampleTrue)self.conv64_2 Residual(256, 64, stride1)self.conv64_3 Residual(256, 64, stride1)# 对应第2组网络层4*Resnet的基本结构self.conv128_1 Residual(256, 128, stride2, downsampleTrue)self.conv128_2 Residual(128 * 4, 128, stride1)self.conv128_3 Residual(128 * 4, 128, stride1)self.conv128_4 Residual(128 * 4, 128, stride1)# 对应第3组网络层6*Resnet的基本结构self.conv256_1 Residual(512, 256, stride2, downsampleTrue)self.conv256_2 Residual(256 * 4, 256, stride1)self.conv256_3 Residual(256 * 4, 256, stride1)self.conv256_4 Residual(256 * 4, 256, stride1)self.conv256_5 Residual(256 * 4, 256, stride1)self.conv256_6 Residual(256 * 4, 256, stride1)# 对应第4组网络层3*Resnet的基本结构self.conv512_1 Residual(1024, 512, stride2, downsampleTrue)self.conv512_2 Residual(512 * 4, 512, stride1)self.conv512_3 Residual(512 * 4, 512, stride1)self.avgpool nn.AdaptiveAvgPool2d((1,1))self.fc nn.Linear(2048, num_classes)def forward(self, x):x self.conv1(x)x self.bn1(x)x self.relu1(x)x self.maxpool1(x)x self.conv64_1(x)x self.conv64_2(x)x self.conv64_3(x)x self.conv128_1(x)x self.conv128_2(x)x self.conv128_3(x)x self.conv128_4(x)x self.conv256_1(x)x self.conv256_2(x)x self.conv256_3(x)x self.conv256_4(x)x self.conv256_5(x)x self.conv256_6(x)x self.conv512_1(x)x self.conv512_2(x)x self.conv512_3(x)x self.avgpool(x)x torch.flatten(x, 1)x self.fc(x)return x利用ResNet50进行CIFAR10分类 数据集 # 导入数据集 from torchvision import datasets import torch import torchvision.transforms as transforms transform transforms.Compose([transforms.Resize((224,224)),transforms.RandomHorizontalFlip(p0.5),transforms.ToTensor(),transforms.Normalize((0.485,0.456,0.406),(0.229,0.224,0.225)) ])classes (plane, car, bird, cat, deer, dog, frog, horse, ship, trunk) cifar_train datasets.CIFAR10(root/data,trainTrue, downloadTrue, transformtransform) cifar_test datasets.CIFAR10(root/data,trainFalse, downloadTrue, transformtransform) train_loader torch.utils.data.DataLoader(cifar_train, batch_size16, shuffleTrue) test_loader torch.utils.data.DataLoader(cifar_test, batch_size16, shuffleFalse)损失函数优化器 # 定义损失函数和优化器 netResnet50(10); device torch.device(cuda:0 if torch.cuda.is_available() else cpu) criterion torch.nn.CrossEntropyLoss() optimizer torch.optim.Adam(net.parameters(), lr0.001) epoch 5 net net.to(device) total_step len(train_loader) train_all_loss [] val_all_loss []训练 import numpy as npfor i in range(epoch):net.train()train_total_loss 0train_total_num 0train_total_correct 0for iter, (images,labels) in enumerate(train_loader):images images.to(device)labels labels.to(device)outputs net(images)loss criterion(outputs,labels)train_total_correct (outputs.argmax(1) labels).sum().item()optimizer.zero_grad()loss.backward()optimizer.step()train_total_num labels.shape[0]train_total_loss loss.item()print(Epoch [{}/{}], Iter [{}/{}], train_loss:{:4f}.format(i1,epoch,iter1,total_step,loss.item()/labels.shape[0]))net.eval()test_total_loss 0test_total_correct 0test_total_num 0for iter,(images,labels) in enumerate(test_loader):images images.to(device)labels labels.to(device)outputs net(images)loss criterion(outputs,labels)test_total_correct (outputs.argmax(1) labels).sum().item()test_total_loss loss.item()test_total_num labels.shape[0]print(Epoch [{}/{}], train_loss:{:.4f}, train_acc:{:.4f}%, test_loss:{:.4f}, test_acc:{:.4f}%.format(i1, epoch, train_total_loss / train_total_num, train_total_correct / train_total_num * 100, test_total_loss / test_total_num, test_total_correct / test_total_num * 100))train_all_loss.append(np.round(train_total_loss / train_total_num,4))val_all_loss.append(np.round(test_total_loss / test_total_num,4))可视化 import matplotlib.pyplot as plt import matplotlib.ticker as tickerplt.figure() plt.title(Train Loss and Test Loss Curve) plt.xlabel(plot_epoch) plt.ylabel(loss) plt.plot(train_all_loss) plt.plot(val_all_loss) plt.legend([train loss, test loss])
http://www.tj-hxxt.cn/news/224563.html

相关文章:

  • 企业地址管理系统wordpress优化0sql
  • 网站建设pdf网站seo快速优化技巧
  • 合肥网站建设步骤微信小程序卖东西
  • 阿里云搭建网站多少钱郑州网站设计网站
  • seo网站优化做什么做网站怎么宣传
  • 网站制作做站长挣钱网站程序组成
  • 一个静态网站开发考虑什么娱乐新闻做的好的网站
  • 武威网站建设优化php做的大型网站有哪些
  • 网页设计国外设计欣赏网站营销策划公司的成本有哪些
  • 网站域名和密码网页设计和网站制作
  • 手机论坛网站模板jsp网站部署怎么做
  • 北京棋森建设有限公司网站宜昌营销型网站建设
  • 优质的广州微网站建设html网页设计代码范例
  • 潍坊制作网站公司安庆网站建设推广
  • 优秀作文网站都有哪些企业seo网站优化设计
  • 邯郸wap网站建设报价莱芜人论坛
  • 图书馆网站建设方案福建建设执业资格注册管理中心网站
  • 假网站备案怎么样分析一个网站
  • 网站开发流程百度文库室内设计考研
  • app建设网站公司简介先做它个天猫网站
  • 网站开发app开发培训餐饮公司网站模板
  • 企业网站建设意义那个网站做拍手比较好
  • 深圳定制网站制作苏州新公司网站建设
  • 合肥 电子商务 网站建设锦州网站建设市场
  • 厦门市建设工程安全管理协会网站海外服务器租赁
  • 免费网站安全软件大全免费下载安装网站做360推广需要什么条件
  • 中国建设银行网站查询密码是什么南京seo排名优化公司
  • 做海报有什么素材网站知乎asp.net 网站开发 教程
  • 网站建设项目广州建设企业网站公司
  • 石家庄网站营销seo专业论坛