模型容器与AlexNet构建

news2024/12/24 21:43:08

一、模型容器——Containers

在这里插入图片描述

nn.Sequential 是 nn.module的容器,用于按顺序包装一组网络层

在这里插入图片描述
在这里插入图片描述

Sequential 容器

nn.Sequential 是 nn.module的容器,用于按顺序包装一组网络层
• 顺序性:各网络层之间严格按照顺序构建
• 自带forward():自带的forward里,通过for循环依次执行前向传播运算

Sequential 是 PyTorch 中的一个容器类,用于将多个模块按照顺序组合在一起形成一个模型。Sequential 容器允许我们按照顺序添加不同的层或模块,以构建神经网络模型。

使用 Sequential 容器,可以通过简单的方式定义一个模型,无需手动编写 forward() 函数。只需要按照顺序将模块添加到 Sequential 容器中,输入数据会按照添加的顺序依次经过每个模块进行计算。

下面是使用 Sequential 容器构建一个简单的神经网络模型的示例:

import torch
import torch.nn as nn

# 创建一个Sequential容器,并按顺序添加模块
model = nn.Sequential(
    nn.Linear(in_features=100, out_features=64),  # 添加一个线性层,输入维度为100,输出维度为64
    nn.ReLU(),  # 添加ReLU激活函数
    nn.Linear(in_features=64, out_features=10),  # 添加一个线性层,输入维度为64,输出维度为10
    nn.Softmax(dim=1)  # 添加Softmax函数,dim=1表示按行计算Softmax
)

在上面的示例中,我们首先创建了一个 Sequential 容器 model,然后按照顺序添加了四个模块:一个线性层、一个ReLU激活函数、另一个线性层和一个Softmax函数。这样就构建了一个简单的神经网络模型。

使用 Sequential 容器可以简化模型的定义和使用,特别适用于简单的线性堆叠结构。但对于一些复杂的网络结构,可能需要使用其他的容器或自定义模型来更灵活地组织模块。

nn.ModuleList

nn.ModuleListnn.Module 的容器,用于包装一组网络层,并以迭代方式调用这些网络层。与 nn.Sequential 不同,nn.ModuleList 可以更灵活地管理和操作网络层。

下面是 nn.ModuleList 的几个主要方法:

  • append(module):在 ModuleList 的末尾添加一个网络层。
  • extend(module_list):将另一个 ModuleList 中的网络层拼接到当前 ModuleList 的末尾。
  • insert(index, module):在指定的位置 index 插入一个网络层。
  • remove(module):从 ModuleList 中移除指定的网络层。
  • pop(index):移除并返回指定位置 index 的网络层。
  • forward(*inputs):重写 nn.Moduleforward 方法,以便迭代调用 ModuleList 中的网络层。
    下面是一个示例,展示如何使用 nn.ModuleList
import torch
import torch.nn as nn
class MyModule(nn.Module):
    def __init__(self):
        super(MyModule, self).__init__()
        self.layers = nn.ModuleList([
            nn.Linear(10, 20),
            nn.ReLU(),
            nn.Linear(20, 30),
            nn.ReLU()
        ])
    def forward(self, x):
        for layer in self.layers:
            x = layer(x)
        return x
model = MyModule()
input_tensor = torch.randn(32, 10)
output = model(input_tensor)

在上述示例中,我们定义了一个自定义的模型 MyModule,其中使用了 nn.ModuleList 来包装了一组网络层。在 forward 方法中,我们使用迭代方式调用了 ModuleList 中的每个网络层,将输入 x 逐层传递,并最终返回输出结果。

nn.ModuleDict

nn.ModuleDict是nn.Module的容器,用于包装一组网络层,并以索引方式调用网络层。下面是对主要方法的解释:

  • clear(): 清空ModuleDict中的所有网络层。
  • items(): 返回一个可迭代的键值对(key-value pairs)的视图,可以用于遍历ModuleDict中的所有网络层。
  • keys(): 返回一个可迭代的键(key)的视图,可以用于遍历ModuleDict中的所有键。
  • values(): 返回一个可迭代的值(value)的视图,可以用于遍历ModuleDict中的所有值。
  • pop(key): 返回指定键(key)对应的值(value),并从ModuleDict中删除该键值对。
    使用nn.ModuleDict可以方便地管理和调用一组网络层,例如:
import torch
import torch.nn as nn

# 定义自定义模型类 MyModule
class MyModule(nn.Module):
    def __init__(self):
        super(MyModule, self).__init__()
        # 使用 nn.ModuleDict 包装一组网络层
        self.layers = nn.ModuleDict({
            'linear1': nn.Linear(10, 20),  # 第一个线性层,输入维度为10,输出维度为20
            'relu1': nn.ReLU(),  # ReLU激活函数层
            'linear2': nn.Linear(20, 30),  # 第二个线性层,输入维度为20,输出维度为30
            'relu2': nn.ReLU()  # ReLU激活函数层
        })

    def forward(self, x):
        x = self.layers['linear1'](x)  # 调用第一个线性层
        x = self.layers['relu1'](x)  # 调用ReLU激活函数层
        x = self.layers['linear2'](x)  # 调用第二个线性层
        x = self.layers['relu2'](x)  # 调用ReLU激活函数层
        return x

# 实例化自定义模型
model = MyModule()

# 创建输入张量
input_tensor = torch.randn(32, 10)  # 创建一个大小为32x10的随机张量作为输入

# 前向传播
output = model(input_tensor)  # 将输入张量传入模型进行前向传播

在上述代码中,我们使用nn.ModuleDict包装了一组网络层,并使用键(key)来索引调用网络层。在模型的forward方法中,我们通过self.layers[key]的方式来调用具体的网络层,实现了前向传播过程。

容器总结

• nn.Sequential:顺序性,各网络层之间严格按顺序执行,常用于block构建
• nn.ModuleList:迭代性,常用于大量重复网构建,通过for循环实现重复构建
• nn.ModuleDict:索引性,常用于可选择的网络层

AlexNet构建

AlexNet:2012年以高出第二名10多个百分点的准确率获得ImageNet分类任务冠
军,开创了卷积神经网络的新时代

AlexNet特点如下:

  1. 采用ReLU:替换饱和激活函数,减轻梯度消失
  2. 采用LRN(Local Response Normalization):对数据归一化,减轻梯度消失
  3. Dropout:提高全连接层的鲁棒性,增加网络的泛化能力
  4. Data Augmentation:TenCrop,色彩修改

在这里插入图片描述

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

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

相关文章

nodejs版本管理工具nvm的安装与使用

提示:nodejs版本管理工具nvm的安装与使用 文章目录 前言一、安装二、淘宝镜像配置三、安装所需版本的nodejs四、切换nodejs版本五、参考文档总结 前言 需求:新建一个vue3项目,,提示写法错误 查原因为node版本过低 随着技术更新迭…

6个提升Python编程能力的PyCharm插件

大家好,PyCharm作为一款强大的集成开发环境,本身已经提供了许多功能,但一些插件将进一步扩展和增强PyCharm的能力。通过使用这些插件,大家能够更快速地编写代码、提高代码质量、进行调试和优化,并将开发体验提升到一个…

Python 面向对象之元类

Python 面向对象之元类 【一】一切皆对象 【1】元类 元类(metaclass)是Python中用于创建类的类。在Python中,类是对象,而元类就是类的类它们控制类的创建过程,允许你定制类的行为Python中内置的默认元类是type我们用…

SpringMVC概述、SpringMVC 的入门

1.MVC介绍 MVC是一种设计模式,将软件按照模型、视图、控制器来划分: M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为数据承载Bean:专门存储业务数据…

12、DolphinScheduler

1、DolphinScheduler简介 1.1、 DolphinScheduler概述 Apache DolphinScheduler是一个分布式、易扩展的可视化DAG工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。 1.2、 DolphinScheduler核心架构 Dolph…

Unity 踩坑记录 AnyState 切换动画执行两次

AnySate 切换动画 Can Transition To Self 将这个勾选去掉!!!

九州金榜如何让孩子在家庭教育中更优秀

​ 每个人在出生时就有上天恩赐的两份礼物,一份是血脉相连的亲情,一份是家庭的关爱与教育。 最早接触的人就是父母,最早接触的教育就是家庭教育,这对孩子的影响极为深远。 这种家庭教育相比较学校教育,不仅有言传教…

springCould中的Config-从小白开始【10 】

目录 🌭1.spring cloud Config是什么😶‍🌫️😶‍🌫️😶‍🌫️ 🥓2.能干什么😶‍🌫️😶‍🌫️😶‍🌫️ &am…

借用GitHub将typora图片文件快速上传CSDN

前情概要 众所周知,程序员大佬们喜欢用typora软件写代码笔记,写了很多笔记想要放到CSDN上给其他大佬分享,但是在往csdn上搬运的时候,图片总是上传出错,一张一张搞有很麻烦,咋如何搞? 废话不多…

conda新建、配置python3.8虚拟环境,torch-cuda1.8,torchtext0.9.0,huggingface安装transformers库

起因是我在用bert的时候,导包报错 Python 环境缺少 importlib.metadata 模块。importlib.metadata 是 Python 3.8 引入的模块,而我的环境中使用的 Python 版本为 3.7。所以我得重新配置一个python3.8的环境 准备工作 在开始菜单找到anaconda prompt(an…

唠一唠Java线程池

第1章:引言 大家好,我是小黑,咱们今天来聊聊Java线程池,如果没有线程池,每个线程都需要手动创建和销毁线程,那将是多么低效和耗资源啊! 线程池的核心作用就是复用已创建的线程,减少…

什么是MOM,与MES系统的差异是什么

MOM基本概念介绍 由于绝大多数MES只关注生产执行的核心作用, 对维护管理、质量管理和库存管理的重视程度有限,有时甚至缺少这部分功能, 并且未提高到与生产运营相类似的复杂程度, 难以充分满足现代制造企业对其制造运营区域的业务管理需求, 进而直接影响对企业的运营管理效果。…

自带恒压恒流环路的降压型单片车充专用芯片

一、基本概述 XL2009是一款高效降压型DC-DC转换器,固定180KHz开关频率,可以提供最高2.5A输出电流能力,具有低纹波,出色的线性调整率与负载调整率特点。XL2009内置固定频率振荡器与频率补偿电路,简化了电路设计。 PWM …

AArch64 memory management学习(二)

提示 该博客主要为个人学习,通过阅读官网手册整理而来(个人觉得阅读官网的英文文档非常有助于理解各个IP特性)。若有不对之处请参考参考文档,以官网文档为准。AArch64 memory management学习一共分为两章,这是第二章。…

Transformer从菜鸟到新手(五)

引言 上篇文章我们在单卡上完成了完整的训练过程。 从本文开始介绍模型训练/推理上的一些优化技巧,本文主要介绍多卡并行训练。 下篇文章将介绍大模型推理常用的缓存技术。 多卡训练 第一个要介绍的是利用多GPU优化,因为在单卡上训练实在是太慢。这…

ORACLE索引失效和sql优化

全部都是在开发中碰到的真实问题,后续会一直更新本条帖子: 场景一: 使用了函数,导致索引失效 交易日期过滤数据时使用了to_date写法,导致日期字段查询未走索引 将控制台输出的sql 粘贴到plsql 按F5打开解释计划执行窗口…

【Android】 ConstraintLayout实操

由于最近比较悠闲,重新学习了constraintlayout,看着官网学的,官网网站如下:https://developer.android.com/training/constraint-layout?hlzh-cn#alignment 其实之前也小小的学过一波constraintlayout,不过因为用线性…

C#,入门教程(13)——字符(char)及字符串(string)的基础知识

上一篇: C#,入门教程(12)——数组及数组使用的基础知识https://blog.csdn.net/beijinghorn/article/details/123918227 字符串的使用与操作是必需掌握得滚瓜烂熟的编程技能之一!!!!! C#语言实…

Copilot 插件的使用介绍:如何快速上手

GitHub Copilot 本文主要介绍如何通过脚本工具激活 GitHub Copilot 插件,提供安装及激活图文教程,大家按下面操作即可激活GitHub Copilot插件,免费使用Ai编码工具 一、GitHub Copilot 介绍 GitHub Copilot 是由 GitHub 和 OpenAI 共同开发的…

Namp端口扫描

在 CentOS 7 上安装 Nmap 的步骤如下: 打开终端: 作为 root 用户,您已经具备执行安装命令的权限。 使用 Yum 安装 Nmap: 在终端中,输入以下命令来安装 Nmap:sudo yum install nmap如果您已经是 root 用户&…