19. 网络结构搭建实例

news2024/9/21 14:19:17
网络结构搭建实例
1. 网络结构图
  • 图示为适应 cifar10 数据集的一个网络结构图,本文主要针对于复现如下网络结构,并介绍相关函数的使用

2. 网络结构各层参数分析
  • 复现网络结构前需要对各层的参数进行分析

    • 第一层:Input (3*32*32) --> Conv(5*5) --> output(32*32*32)得,卷积层的参数为:

      nn.Conv2d(in_channels = 3,
               out_channels = 32,
               kernel_siza = 5,
               stride = 1, # 公式计算
               padding = 2, # 公式计算
               dilation=1) # 公式计算
      
    • 第二层:MaxPooling(2*2) --> output(32*16*16)得,池化层的参数为:

      nn.MaxPool(kernel_size=2,
                 stride=2, # 公式计算
                 padding=0, # 公式计算
                 dilation=1) # 公式计算
      
    • 第三层: Conv(5*5) --> output(32*16*16),卷积层参数为

      nn.Conv2d(in_channels = 32,
               out_channels = 32,
               kernel_siza = 5,
               stride = 1, # 公式计算
               padding = 2, # 公式计算
               dilation=1) # 公式计算
      
    • 第四层:MaxPooling(2*2) --> output(32*8*8),池化层的参数为

      nn.MaxPool(kernel_size=2,
                 stride=2, # 公式计算
                 padding=0, # 公式计算
                 dilation=1) # 公式计算
      
    • 第五层:Conv(5*5) --> output(64*8*8),卷积层参数为

      nn.Conv2d(in_channels=32, 
                out_channels=64, 
                kernel_size=5,
                stride = 1, # 公式计算
                padding = 2, # 公式计算
                dilation=1) # 公式计算
      
    • 第六层:MaxPooling(2*2) --> output(64*4*4),卷积层参数为

      nn.MaxPool(kernel_size=2,
                 stride=2, # 公式计算
                 padding=0, # 公式计算
                 dilation=1) # 公式计算
      
    • 第七层:Flatten()展开并线性变换为64结点

      • nn.Flatten()层主要用于将数据展开,对于一个 (64, 4, 4)维度的数据,就是以最后一个维度优先的原则,将整个多维矩阵展平,维度变为为: (64, 4, 4)–> (1, 1024)

        nn.Flatten()
        
      • Linear(1024, 64) 全连接层将1024个数据,映射为64个数据,数据维度变换位:(1, 1024) --> (1, 64)

        nn.Linear(in_features=1024, 
                  out_features=64)
        
    • 第八层:全连接层 (1, 64) --> (1, 10),对应的线性层参数为

      nn.Linear(in_features=64,
               out_features=10)
      
3. 构建完整的网络结构
  • 创建一个基本网络架构 Modelforward函数中定义完整的数据处理流程

    class Model(nn.Module):
        def __init__(self):
            super(Model, self).__init__()
            self.conv1 = nn.Conv2d(in_channels=3, 
                                   out_channels=32, 
                                   kernel_size=5,
                                   stride=1, 
                                   padding=2,
                                   dilation=1)
            
            self.pool1 = nn.MaxPool2d(kernel_size=2,
                                      stride=2,
                                      padding=0,
                                      dilation=1)
            
            self.conv2 = nn.Conv2d(in_channels=32, 
                                   out_channels=32, 
                                   kernel_size=5,
                                   stride=1, 
                                   padding=2,
                                   dilation=1)
            
            self.pool2 = nn.MaxPool2d(kernel_size=2,
                                      stride=2,
                                      padding=0,
                                      dilation=1)
            
            self.conv3 = nn.Conv2d(in_channels=32, 
                                   out_channels=64, 
                                   kernel_size=5,
                                   stride=1, 
                                   padding=2,
                                   dilation=1)
            
            self.pool3 = nn.MaxPool2d(kernel_size=2,
                                      stride=2,
                                      padding=0,
                                      dilation=1)
            
            self.flatten = nn.Flatten()
            
            self.linear1 = nn.Linear(in_features=1024, 
                                    out_features=64)
            
            self.linear2 = nn.Linear(in_features=64, 
                                    out_features=10)
            
        def forward(self, x):
            x = self.conv1(x) # 第一层卷积
            x = self.pool1(x) # 第二层池化
            x = self.conv2(x) # 第三层卷积
            x = self.pool2(x) # 第四层池化
            x = self.conv3(x) # 第五层卷积
            x = self.pool3(x) # 第六层池化
            x = self.flatten(x) # 第七层展开
            x = self.linear1(x) # 第七层全连接
            x = self.linear2(X) # 第八层全连接
            return x
    
  • 在应用到具体的数据处理之前,可以通过创建一个基本的数据样例,来判断网络的整体输出结构是否有问题

    input = torch.ones(64, 3, 32, 32)
    model = Model()
    output = model(input)
    print(output.size()) # torch.Size([64, 10])
    
4. 使用Sequential简化代码
  • SequentialCompose类功能相仿,都是将完整的数据处理序列进行集成,从而简化代码结构

    class Model(nn.Module):
        def __init__(self):
            super(Model, self).__init__()
            self.model = nn.Sequential(
                nn.Conv2d(3, 32, 5, 1, 2, 1),
                nn.MaxPool2d(2, 2, 0, 1),
                nn.Conv2d(32, 32, 5, 1, 2, 1),
                nn.MaxPool2d(2, 2, 0, 1),
                nn.Conv2d(32, 64, 5, 1, 2, 1),
                nn.MaxPool2d(2, 2, 0, 1),
                nn.Flatten(),
                nn.Linear(1024, 64),
                nn.Linear(64, 10)
            )
    
        def forward(self, x):
            x = self.model(x)
            return x
    
    • Sequential()函数将所有的层结构操作集成起来,配建成一个完整的数据处理序列,该函数能够将冗余的代码简化,代码结构更友好
5. 使用TensorBoard可视化网络结构图
  • TensorBoard模块提供了网络结构图可视化模块 add_graph,能够细节化展示网络结构图

    with SummaryWriter("log") as writer:
        writer.add_graph(model = Model(), 
                         input_to_model=input)
    
    • model: 指定需要进行展示的Model类的实例
    • input_to_model: 指明用于传入网络结构中进行处理的数据
  • 使用命令 tensorboard --logdir=log 打开 tensorboard 的控制台

    • 选择GRAPHS视图,可以看到基于 Model 类实例构建的网络结构简图

      image-20240820135319328

    • 双击结点,并使用滚轮放大结构图,可以看到详细的参数,如图所示,x是一个 (64, 3, 32, 32)的数据作为 input

      image-20240820135446808

    • 这里同样可以查看完整的网络结构示意图,每一条脉络上都清楚的标明了当前数据在进行网络数据处理的过程中,维度数据的变换

      image-20240820135629452

6. print函数对网络的输出结果
  • 对于上述手动搭建的网络结构,在不适用 Sequential 的情况下,直接输出 Model 类的实例化

    print(Model())
    >>>
    Model(
      (conv1): Conv2d(3, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
      (pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
      (conv2): Conv2d(32, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
      (pool2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
      (conv3): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
      (pool3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
      (flatten): Flatten(start_dim=1, end_dim=-1)
      (linear1): Linear(in_features=1024, out_features=64, bias=True)
      (linear2): Linear(in_features=64, out_features=10, bias=True)
    )
    
    • (xxx): layer(): 输出结果中 :的前半部分 (xxx) 是网络层在 Model 类中定义的变量名称, 后半部分 layer() 是每一层对应的具体参数
  • 对于一个使用 Sequential 简化的网络结构的输出结果如下

    print(Model())
    >>>
    Model(
      (model): Sequential(
        (0): Conv2d(3, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
        (1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
        (2): Conv2d(32, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
        (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
        (4): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
        (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
        (6): Flatten(start_dim=1, end_dim=-1)
        (7): Linear(in_features=1024, out_features=64, bias=True)
        (8): Linear(in_features=64, out_features=10, bias=True)
      )
    )
    
    • 输出结果中表明了数据处理顺序,并给出了每一层的具体参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年<9月版>宠物空气净化器推荐,希喂、霍尼韦尔、IAM吸毛吗

宠物空气净化器现在是每个养宠家庭都必不可少的家电,我们可以没有吸尘器、扫地机器人,但绝对不能没有宠物空气净化器!有了宠物空气净化器就可以帮我们解决浮毛这一大难题,特别是换季时节,宠物开始换毛,有了…

leetcode hot100_part4_子串

2024/4/20—4/21 560.和为K的子数组 前缀和哈希表,做二叉树的时候也有这个套路。注意细节,遍历到当前前缀和的时候是先找结果个数还是先加入哈希?应该先找结果个数,不然的话,当前位置也算上了(因为是前缀和…

【网络安全】-文件上传漏洞

文件操作漏洞包括文件上传漏洞,文件包含漏洞,文件下载漏洞。 文章目录 前言 什么是文件上传漏洞? 文件上传的验证与绕过: 1.前端js验证:   Microsft Edge浏览器: Google Chrome浏览器: 2.后端…

【jvm】记一次hive堆heap内存溢出的排查

先看下java的内存模型 监控jvm工具:visualVM 摘录一下内容: 由c开发的jvm,它巧妙地设计了java的设计理念——即万物皆对象。并设计了这些对象应该如何存储,如何调用,并通过不断迭代设计让对象的存储和回收&#xff0…

最新安装vmware地址(官网找半天没找到)

CDS Repository - /var/www/public/stage/session-120/cds/vmw-desktop 直接走这个点进去,windows点ws,linux和mac点fusion进去下对应版本 win为例子:CDS Repository - /var/www/public/stage/session-50/cds/vmw-desktop/ws/17.6.0/242380…

MyBatis中一对多关系的两种处理方法

目录 1.多表联查(通过collection标签的ofType属性) 1)mapper 2)mapper.xml 3)测试代码 4)测试结果 2.分布查询(通过collection标签的select属性) 1)mapper 2)mapper.xml 3&#xff0…

铁路输电线路异物检测数据集

铁路输电线路异物检测数据集,共6GB,14000余图像,40000标注,标注鸟巢,塑料袋,气球,漂浮物四大类。coco格式标注。 项目背景: 铁路输电线路是保障铁路运输安全的重要组成部分&#xf…

Golang | Leetcode Golang题解之第405题数字转换为十六进制数

题目&#xff1a; 题解&#xff1a; func toHex(num int) string {if num 0 {return "0"}sb : &strings.Builder{}for i : 7; i > 0; i-- {val : num >> (4 * i) & 0xfif val > 0 || sb.Len() > 0 {var digit byteif val < 10 {digit 0…

小程序组件间通信

文章目录 父传子子传父获取组件实例兄弟通信 父传子 知识点&#xff1a; 父组件如果需要向子组件传递指定属性的数据&#xff0c;在 WXML 中需要使用数据绑定的方式 与普通的 WXML 模板类似&#xff0c;使用数据绑定&#xff0c;这样就可以向子组件的属性传递动态数据。 父…

随机森林算法介绍

文章目录 基本原理关键步骤举例说明算法流程优点缺点实现示例总结 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;主要用于分类和回归任务。它通过集成多棵决策树来提高模型的准确性和泛化能力。以下是随机森林的详细算法介绍&#xff1a; 基本…

VMware Tools系列二:图解安装VMware Tools过程

一、安装环境&#xff1a; VMware Workstation Pro17华为OpenEuler虚拟机 二、安装步骤&#xff1a; 在VMware Workstation中为OpenEuler虚拟机安装VMware Tools的步骤如下&#xff1a; 1. 确保OpenEuler虚拟机正在运行。注意&#xff0c;安装的VMware Tools只对当前虚拟机…

结合人工智能,大数据,物联网等主流技术实现业务流程的闭环整合的名厨亮灶开源了

明厨亮灶视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。AI技术可以24小时…

一文学会Containerd配置和镜像加速

一文学会Containerd配置和镜像加速 ❤️ 摘要: 本文介绍了 Containerd 的基本概念及其在 Kubernetes 中的作用&#xff0c;并详细说明了如何通过配置代理、使用国内镜像源或手动下载等方式加速镜像拉取。此外&#xff0c;还提供了针对不同场景的具体配置方法&#xff0c;包括通…

解码 OpenAI 的 o1 系列大型语言模型

OpenAI 表示&#xff0c;其 Strawberry 项目已升级为新的大型语言模型 (LLM) 系列&#xff0c;公司将其命名为 OpenAI o1。 该公司表示&#xff0c;新系列模型还包括一个 o1-mini 版本&#xff0c;以提高成本效益&#xff0c;可根据其推理能力与最新的GPT-4o 模型进行区分。 …

Visual Studio(vs)下载安装C/C++运行环境配置和基本使用注意事项

基本安装 点击跳转到vs官网点击箭头所指的按钮进行下载双击运行刚才下载好的下载器点击继续勾选“使用C的桌面开发”和“Visual Studio扩展开发”点击“安装位置”&#xff0c;对vs的安装位置进行更改。你可以跟我一样只选择D盘或者其他你空闲的盘&#xff0c;然后将默认的路径…

AIGC文本生成

文本生成是一种人工智能技术&#xff0c;它基于深度学习算法&#xff0c;根据给定的提示信息创作出有逻辑、连贯的文本内容。 文本生成所需的输入&#xff08;提示或Prompt&#xff09;可以是简单的关键词、一句话概述或是更复杂的指令和上下文信息。文本生成模型通过分析大量…

AR技术在电商行业中有哪些应用场景?有何优势?

AR&#xff08;增强现实&#xff09;技术在电商行业中的应用场景广泛且多样&#xff0c;为消费者带来了全新的购物体验&#xff0c;同时也为商家提供了诸多优势。51建模网为电商行业AR技术应用提供解决方案&#xff0c;以下是AR技术在电商行业中的主要应用场景及其优势&#xf…

数据结构:时间复杂度与空间复杂度

目录 算法效率时间复杂度大O渐进表示法时间复杂度计算案例 空间复杂度空间复杂度案例 复杂度算法题 算法效率 算法在编写成可执行程序后&#xff0c;运⾏时需要耗费时间资源和空间(内存)资源 。因此衡量⼀个算法的好坏&#xff0c;⼀般是从时间和空间两个维度来衡量的&#xf…

通过sshd_config限制用户登录

在CentOS Stream或其他现代的Linux发行版中&#xff0c;你可能会发现传统的hosts.deny和 hosts.allow文件已经不存在或不被使用。这是因为随着时间的推移&#xff0c;系统的安全策略和网络管理工具已经发生了演变&#xff0c;许多系统管理员和发行版维护者选择使用更现代、更灵…

12. DataLoader的基本使用

DataLoader的基本使用 1. 为什么要使用DataLoader DataLoader对创建好的DataSet的样本取样进行了集成操作&#xff0c;非常方便对于后续网络训练、测试的数据集的选择和使用 DataLoader可以集成了数据批量加载的方法&#xff0c;可以使用 batch_size 设置批量大小&#xff0c…