动手学深度学习(pytorch)学习记录18-层和块[学习记录]

ops/2024/9/18 12:32:41/ 标签: 深度学习, pytorch, 学习

在具有单一输出的线性模型中
单个神经网络完成这几项工作 :
(1)接受一些输入;
(2)生成相应的标量输出;
(3)具有一组相关 参数(parameters),更新这些参数可以优化某目标函数。

当考虑具有多个输出的网络时, 我们利用矢量化算法来描述整层神经元。
像单个神经元一样,层完成这些工作:
(1)接受一组输入
(2)生成相应的输出
(3)由一组可调整参数描述。 当使用softmax回归时,一个单层本身就是模型。

对于多层感知机而言,整个模型及其组成层都是这种架构。 整个模型接受原始输入(特征),生成输出(预测), 并包含一些参数(所有组成层的参数集合)。 同样,每个单独的层接收输入(由前一层提供), 生成输出(到下一层的输入),并且具有一组可调参数, 这些参数根据从下一层反向传播的信号进行更新。

为了实现这些复杂的网络,需要引入了神经网络块的概念。 块(block)可以描述单个层、由多个层组成的组件或整个模型本身。 使用块进行抽象的一个好处是可以将一些块组合成更大的组件, 这一过程通常是递归的,如 图5.1.1所示。 通过定义代码来按需生成任意复杂度的块, 我们可以通过简洁的代码实现复杂的神经网络。

回顾多层感知机代码

# 回顾多层感知机代码
import torch
from torch import nn
from torch.nn import functional as Fnet = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))X = torch.rand(2, 20)
net(X)

在这里插入图片描述

自定义块

class MLP(nn.Module):# 用模型参数声明层。这里声明两个全连接的层def __init__(self):# 调用MLP的父类nn.Module的构造函数来执行必要的初始化。# 这样,在类实例化时也可以指定其他函数参数,例如模型参数paramssuper().__init__()self.hidden = nn.Linear(20, 256)  # 隐藏层self.out = nn.Linear(256, 10)  # 输出层# 定义模型的前向传播,即如何根据输入X返回所需的模型输出def forward(self, X):# 注意,这里我们使用ReLU的函数版本,其在nn.functional模块中定义。return self.out(F.relu(self.hidden(X)))
# 尝试一下这个函数
net = MLP()
net(X)

在这里插入图片描述

顺序块

Sequential的设计是为了把其他模块串起来。 为了构建我们自己的简化的MySequential, 我们只需要定义两个关键函数:
一种将块逐个追加到列表中的函数;
一种前向传播函数,用于将输入按追加块的顺序传递给块组成的“链条”。
下面的MySequential类提供了与默认Sequential类相同的功能。

class MySequential(nn.Module):def __init__(self, *args):super().__init__()for idx, module in enumerate(args):# 这里,module是Module子类的一个实例。我们把它保存在'Module'类的成员# 变量_modules中。_module的类型是OrderedDictself._modules[str(idx)] = moduledef forward(self, X):# OrderedDict保证了按照成员添加的顺序遍历它们for block in self._modules.values():X = block(X)return X

__init__函数将每个模块逐个添加到有序字典_modules中。 简而言之,_modules的主要优点是: 在模块的参数初始化过程中, 系统知道在_modules字典中查找需要初始化参数的子块。
当MySequential的前向传播函数被调用时, 每个添加的块都按照它们被添加的顺序执行。 现在可以使用MySequential类重新实现多层感知机。
MySequential的用法与Sequential类编写的代码相同。

net = MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))
net(X)

在这里插入图片描述

在向前传播中执行其他操作

并不是所有的架构都是简单的顺序架构。 当需要更强的灵活性时,我们需要定义自己的块。 例如,我们有时候可能需要在前向传播函数中执行其他python命令。

class FixedHiddenMLP(nn.Module):def __init__(self):super().__init__()# 不计算梯度的随机权重参数。因此其在训练期间保持不变self.rand_weight = torch.rand((20, 20), requires_grad=False)self.linear = nn.Linear(20, 20)def forward(self, X):X = self.linear(X)# 使用创建的常量参数以及relu和mm函数X = F.relu(torch.mm(X, self.rand_weight) + 1)# 复用全连接层。这相当于两个全连接层共享参数X = self.linear(X)# 控制流while X.abs().sum() > 1:X /= 2return X.sum()

在这个FixedHiddenMLP模型中实现了一个隐藏层, 其权重(self.rand_weight)在实例化时被随机初始化,之后为常量。 这个权重不是一个模型参数,因此它永远不会被反向传播更新。 然后,神经网络将这个固定层的输出通过一个全连接层。

注意,在返回输出之前,模型做了一些不寻常的事情: 它运行了一个while循环,在L1范数大于1的条件下, 将输出向量除以2,直到它满足条件为止。 最后,模型返回了X中所有项的和。 注意,此操作可能不会常用于在任何实际任务中, 这里只是只展示如何将任意代码集成到神经网络计算的流程中。

net = FixedHiddenMLP()
net(X)

在这里插入图片描述
还可以混合搭配各种组合块的方法。(这不会就是网上吹的缝合块吧[/狗头])

class NestMLP(nn.Module):def __init__(self):super().__init__()self.net = nn.Sequential(nn.Linear(20, 64), nn.ReLU(),nn.Linear(64, 32), nn.ReLU())self.linear = nn.Linear(32, 16)def forward(self, X):return self.linear(self.net(X))chimera = nn.Sequential(NestMLP(), nn.Linear(16, 20), FixedHiddenMLP())
chimera(X)

在这里插入图片描述
封面图片来源

欢迎点击我的主页查看更多文章。
本人学习地址https://zh-v2.d2l.ai/
恳请大佬批评指正。


http://www.ppmy.cn/ops/104152.html

相关文章

25版王道数据结构课后习题详细分析 第五章 树与二叉树 5.3 二叉树的遍历和线索二叉树 选择题部分

一、单项选择题 ———————————————————— ———————————————————— 解析:二叉树中序遍历的最后一个结点一定是从根开始沿右子女指针链走到底的结点,设用p指示。若结点p不是叶结点(其左子树非空),则前序遍历的最后一…

低代码技术助力移动端开发:简化开发流程,实现快速创新

在移动互联网快速发展的今天,企业和开发者面临着越来越高的需求,要求开发高质量、功能强大的移动应用,以满足用户的期待和市场的变化。然而,传统的移动端开发流程通常复杂且耗时,需要投入大量的资源和开发人员。为了应…

《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(2)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(1) 7.1 数据链路层的组成结构 数据链路层使用ACK/NAK协议发送和接收TLP,由发送部件和接收部件组成。其中,发送部件由…

概率论与编程的联系及数据科学应用

目录 引言 第一章 概率模拟与编程实现 1.1 随机数生成与蒙特卡罗模拟 1.1.2 蒙特卡罗模拟 第二章 统计建模与数据分析 2.1 统计模型实现 2.2 概率图模型 第三章 概率论在机器学习中的应用 3.1 随机森林与决策树 3.2 贝叶斯分类器 总结与展望 引言 在大数据和人工智…

数据结构与算法(快速基础C++版)

数据结构与算法(快速基础C版) 1. 基本概念第1章 绪论1.1 数据结构的研究内容1.2 基本概念和术语1.2.1 数据、数据元素、数据项和数据对象1.2.2 数据结构1.2.3 数据类型和抽象数据类型1.2.4 概念小结 1.3 算法和算法分析1.4 总结 2. 基本的数据结构第2章 …

【Python】--- 基础语法(上)

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: Python 本篇博客博主将分享一些python的基础语法。 🏠 常量和表达式 我们可以把Python当成一个计算器,进行一些简单的算术运算 print(1 …

硬件和软件哪个吃香?

大家好,我是记得诚。 知乎上的一个帖子。 本人计算机科学与技术专业本科毕业,准备出来工作,但是不知道从事哪方面的工作,硬件和软件哪个相对工资高,比较容易上手呢? 记得诚回答: 这是一个老…

Qt中的各种“q+基本数据类型“

前言 虽说Qt支持C的数据类型,但是还是用Qt自己又封装的数据类型比较好。你在支持能有我原生的支持? 正文 先看qint系列 有qint8,quint8,qint16,quint16,qint32,quint32,qint64,quint64 源码如下 解读 1. typedef signed char qint8; 说明: 定义…

并发性服务器

同一时刻能处理多个客户端 多进程: int init_tcp_ser(const char *ip,unsigned short port) {int sockfd socket(AF_INET,SOCK_STREAM,0);if(-1 sockfd){perror("fail socket");return -1;}struct sockaddr_in ser;ser.sin_family AF_INET;ser.sin_por…

[杂项] vscode离线安装插件

VS code 离线安装插件的方式(超简单) 可能需要自由上网,来下载vscode的离线插件

绝区零苹果电脑能玩吗,如何在Mac上玩绝区零?绝区零MacBook 下载安装保姆级教程

《绝区零》是一款由米哈游开发的都市动作冒险游戏,游戏的故事背景设定在一个名为「新艾利都」的现代化大都市中,玩家将扮演一对「绳匠」兄妹展开冒险。很多玩家都在问苹果电脑笔记本Mac怎么玩绝区零,今天就给大家介绍一下《绝区零》是一款什么…

LeetCode15. 三数之和(2024秋季每日一题 8)

给你一个整数数组 n u m s nums nums ,判断是否存在三元组 [ n u m s [ i ] , n u m s [ j ] , n u m s [ k ] ] [nums[i], nums[j], nums[k]] [nums[i],nums[j],nums[k]] 满足 i ! j 、 i ! k i ! j、i ! k i!j、i!k 且 j ! k j ! k j!k ,同时还…

QGraphicsview相关学习

文章学习自: Qt_绘图框架_QGraphicsview实现缩放移动图片_Livy0123的博客-CSDN博客 这里进行一些自己的分析和理解。 (1) 自定义类MyGraphicsView继承自QGraphicsView 核心是重定义的滚轮事件。 void MyGraphicsView::wheelEvent(QWheelEvent *ev) {if(Qt::CT…

关于数字存储和byte[]数组的一些心得

前言 最近做项目,发现一些规律,比如数字的存储和字符串的存储,先说数字吧,最常见的整数,就涉及反码和补码,根据这些规则,甚至我们自己也能造一种数据存储结构,比如1个字节8bit&…

鸿蒙上架流程

鸿蒙应用发布上架相关流程: 发布所需要申请的证书和profile文件,然后在appGallery Connect提交上架申请,审批通过分发到各个渠道 流程: 在appGallery Connect选择项目,创建添加项目,填写对应信息&#xff0…

莫比乌斯反演总结

目录 前置知识1.1 线性筛 (欧拉筛)1.2 整除分块 (数论分块)引理 1引理 2引理 3实现例 1例 2例 3例 4 1.3 数学知识积性函数莫比乌斯函数狄利克雷(Dirichlet)卷积 莫比乌斯反演2.1 公式2.2 常用~(唯一)~结论2.3 例题例 1例 2例 3例 4例 5练习 1练习 2练习 3练习 4 懵逼乌斯反演总…

汽车免拆诊断案例 | 马自达CX-3无音频输出

故障现象: 使用触摸屏打开收音机时,单选按钮打开收音机,但无法访问菜单。使用中控台中的旋转控制旋钮时,也会遇到相同的情况。 没有音频输出到车上的任何扬声器,包括卫星导航、蓝牙或语音识别。音量调节也不起作用&a…

word宏代码选择所有公式 选择所有表格

选择视图-宏代码 输入宏名字【SelectAllEquations】,选择加号,添加宏代码 输入宏代码,并保存,然后关闭: Sub SelectAllEquations()Dim xMath As OMathDim I As IntegerWith ActiveDocument.DeleteAllEditableRanges w…

【提示学习论文】CoCoLe:Conceptual Codebook Learning for Vision-Language Models

Conceptual Codebook Learning for Vision-Language Models(ECCV 2024) CPL的改进暂无代码 CPL 详见CPL论文 CoCoLe a:手工概念缓存的建立过程b:制作提示的过程,将图像输入Ev,得到image features v 作…

一个比 Nginx 还简单的 Web 服务器

企业级的 Web 服务器非常多,Nginx、Tomcat、Apache、IIS、FastAPI、Flask 等。今天松哥再给大家介绍一个开源的 Web 服务器,这款服务器具备自动 HTTPS 功能和高度可配置性,它的名字是:Caddy。 Caddy 是一个 Go 编写的 Web 服务器&…