第21周周报
总结学习了层和块内容中的顺序块和自定义块层和块之前首次介绍神经网络时我们关注的是具有单一输出的线性模型。在这里整个模型只有一个输出。注意单个神经网络1接受一些输入2生成相应的标量输出3具有一组相关参数更新这些参数可以优化某目标函数。然后当考虑具有多个输出的网络时我们利用矢量化算法来描述整层神经元。像单个神经元一样层1接受一组输入2生成相应的输出3由一组可调整参数描述。当我们使用softmax回归时一个单层本身就是模型。然而即使我们随后引入了多层感知机我们仍然可以认为该模型保留了上面所说的基本架构。对于多层感知机而言整个模型及其组成层都是这种架构。整个模型接受原始输入特征生成输出预测并包含一些参数所有组成层的参数集合。同样每个单独的层接收输入由前一层提供生成输出到下一层的输入并且具有一组可调参数这些参数根据从下一层反向传播的信号进行更新。事实证明研究讨论“比单个层大”但“比整个模型小”的组件更有价值。例如在计算机视觉中广泛流行的ResNet‐152架构就有数百层这些层是由层groupsoflayers的重复模式组成。目前ResNet架构仍然是许多视觉任务的首选架构。在其他的领域如自然语言处理和语音层组以各种重复模式排列的类似架构现在也是普遍存在。为了实现这些复杂的网络我们引入了神经网络块的概念。块可以描述单个层、由多个层组成的组件或整个模型本身。使用块进行抽象的一个好处是可以将一些块组合成更大的组件这一过程通常是递归的如图1.1所示。通过定义代码来按需生成任意复杂度的块我们可以通过简洁的代码实现复杂的神经网络。图1.1多个层被组合成块形成更大的模型从编程的角度来看块由类class表示。它的任何子类都必须定义一个将其输入转换为输出的前向传播函数并且必须存储任何必需的参数。注意有些块不需要任何参数。最后为了计算梯度块必须具有反向传播函数。在定义我们自己的块时由于自动微分在2.5节中引入提供了一些后端实现我们只需要考虑前向传播函数和必需的参数。下面的代码生成一个网络其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层然后是一个具有10个隐藏单元且不带激活函数的全连接输出层。import torch from torch import nn from torch.nn import functional as F net nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10)) X torch.rand(2, 20) net(X)tensor([[0.0343,0.0264,0.2505,-0.0243,0.0945,0.0012,-0.0141,0.0666,-0.0547,-0.0667],[0.0772,-0.0274,0.2638,-0.0191,0.0394,-0.0324,0.0102,0.0707,-0.1481,-0.1031]], grad_fnAddmmBackward0)在这个例子中我们通过实例化nn.Sequential来构建我们的模型层的执行顺序是作为参数传递的。简而言之nn.Sequential定义了一种特殊的Module即在PyTorch中表示一个块的类它维护了一个由Module组成的有序列表。注意两个全连接层都是Linear类的实例Linear类本身就是Module的子类。另外到目前为止我们一直在通过net(X)调用我们的模型来获得模型的输出。这实际上是net.__call__(X)的简写。这个前向传播函数非常简单它将列表中的每个块连接在一起将每个块的输出作为下一个块的输入。自定义块要想直观地了解块是如何工作的最简单的方法就是自己实现一个。在实现我们自定义块之前我们简要总结一下每个块必须提供的基本功能。1.将输入数据作为其前向传播函数的参数。2.通过前向传播函数来生成输出。请注意输出的形状可能与输入的形状不同。例如我们上面模型中的第一个全连接的层接收一个20维的输入但是返回一个维度为256的输出。3.计算其输出关于输入的梯度可通过其反向传播函数进行访问。通常这是自动发生的。4.存储和访问前向传播计算所需的参数。5.根据需要初始化模型参数。在下面的代码片段中我们从零开始编写一个块。它包含一个多层感知机其具有256个隐藏单元的隐藏层和一个10维输出层。注意下面的MLP类继承了表示块的类。我们的实现只需要提供我们自己的构造函数Python中的__init__函数和前向传播函数。class MLP(nn.Module): # 用模型参数声明层。这里我们声明两个全连接的层 def __init__(self): # 调用MLP的父类Module的构造函数来执行必要的初始化。 # 这样在类实例化时也可以指定其他函数参数例如模型参数params稍后将介绍 super().__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)))我们首先看一下前向传播函数它以X作为输入计算带有激活函数的隐藏表示并输出其未规范化的输出值。在这个MLP实现中两个层都是实例变量。要了解这为什么是合理的可以想象实例化两个多层感知机net1和net2并根据不同的数据对它们进行训练。当然我们希望它们学到两种不同的模型。接着我们实例化多层感知机的层然后在每次调用前向传播函数时调用这些层。注意一些关键细节首先我们定制的__init__函数通过super().__init__()调用父类的__init__函数省去了重复编写模版代码的痛苦。然后我们实例化两个全连接层分别为self.hidden和self.out。注意除非我们实现一个新的运算符否则我们不必担心反向传播函数或参数初始化系统将自动生成这些。net MLP() net(X)tensor([[0.0669,0.2202,-0.0912,-0.0064,0.1474,-0.0577,-0.3006,0.1256,-0.0280,0.4040],[0.0545,0.2591,-0.0297,0.1141,0.1887,0.0094,-0.2686,0.0732,-0.0135,0.3865]], grad_fnAddmmBackward0)块的一个主要优点是它的多功能性。我们可以子类化块以创建层如全连接层的类、整个模型如上面的MLP类或具有中等复杂度的各种组件。我们在接下来的章节中充分利用了这种多功能性比如在处理卷积神经网络时。顺序块现在我们可以更仔细地看看Sequential类是如何工作的回想一下Sequential的设计是为了把其他模块串起来。为了构建我们自己的简化的MySequential我们只需要定义两个关键函数1.一种将块逐个追加到列表中的函数2.一种前向传播函数用于将输入按追加块的顺序传递给块组成的“链条”。下面的MySequential类提供了与默认Sequential类相同的功能。class MySequential(nn.Module): def __init__(self, *args): super().__init__() for idx, module in enumerate(args): # 这里module是Module子类的一个实例。我们把它保存在Module类的成员 # 变量_modules中。_module的类型是OrderedDict self._modules[str(idx)] module def forward(self, X): # OrderedDict保证了按照成员添加的顺序遍历它们 for block in self._modules.values(): X block(X) return X__init__函数将每个模块逐个添加到有序字典_modules中。读者可能会好奇为什么每个Module都有一个_modules属性以及为什么我们使用它而不是自己定义一个Python列表简而言之_modules的主要优点是在模块的参数初始化过程中系统知道在_modules字典中查找需要初始化参数的子块。当MySequential的前向传播函数被调用时每个添加的块都按照它们被添加的顺序执行。现在可以使用我们的MySequential类重新实现多层感知机。net MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10)) net(X)tensor([[2.2759e-01,-4.7003e-02,4.2846e-01,-1.2546e-01,1.5296e-01,1.8972e-01,9.7048e-02,4.5479e-04,-3.7986e-02,6.4842e-02],[2.7825e-01,-9.7517e-02,4.8541e-01,-2.4519e-01,-8.4580e-02,2.8538e-01,3.6861e-02,2.9411e-02,-1.0612e-01,1.2620e-01]],grad_fnAddmmBackward0)

相关新闻

Unity集成Dear ImGui实战:十大常见问题与解决方案详解

Unity集成Dear ImGui实战:十大常见问题与解决方案详解

1. 项目概述:为什么要在Unity里用Dear ImGui?如果你是一个Unity开发者,尤其是在开发工具、编辑器扩展、调试面板,或者需要快速构建一个不追求华丽UI但要求高效迭代的原型时,你大概率听说过或者已经用上了Dear ImGui。这…

2026/7/26 6:16:41 阅读更多 →
涂胶显影机(Track)初级工程师面试打分卡

涂胶显影机(Track)初级工程师面试打分卡

岗位名称:涂胶显影机(Track)技术岗初级工程师 面试对象:__________ 面试日期:__________ 面试官:__________ 总分:100分 评级标准:优秀(90-100分)、良好(75-89分)、合格(60-74分)、不合格(60分以下) 岗位定位说明:本打分卡针对Track设备初级技术工程师,…

2026/7/27 7:26:50 阅读更多 →
6个Prompt设计方法提升AI编程效率

6个Prompt设计方法提升AI编程效率

1. 项目概述作为一名长期使用Cursor的开发者,我发现很多同行虽然安装了这款AI编程工具,却只停留在基础代码补全功能上。实际上,Cursor的潜力远不止于此——通过精心设计的Prompt,它能帮你解决复杂算法设计、系统架构评审、甚至技术…

2026/7/26 6:15:41 阅读更多 →

最新新闻

【非标自动化】2、认识元器件(光电传感器)

【非标自动化】2、认识元器件(光电传感器)

光电传感器光电传感器是一种利用光线检测物体有无、位置、通过状态或距离的传感器。它通常由以下部分组成:发光器接收器信号处理电路输出电路光电传感器先发出可见光或红外光,再根据光线是否被遮挡、反射或返回,判断目标物体是否存在。可以先…

2026/7/27 7:26:24 阅读更多 →
m4s-converter完整解决方案:3步解锁B站缓存视频,永久保存数字记忆

m4s-converter完整解决方案:3步解锁B站缓存视频,永久保存数字记忆

m4s-converter完整解决方案:3步解锁B站缓存视频,永久保存数字记忆 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否…

2026/7/27 7:26:24 阅读更多 →
C#语言从入门到精通:涵盖初级、中级、高级编程及数据结构与算法

C#语言从入门到精通:涵盖初级、中级、高级编程及数据结构与算法

全面掌握C#:从零基础到算法高手的一站式学习路径 这是一套专为编程初学者与进阶开发者量身打造的C#语言系统教程,内容覆盖初级入门、中级核心、高级应用以及数据结构与算法四大核心模块,帮助你从语法基础稳步进阶到企业级开发能力。 为什么…

2026/7/27 7:26:24 阅读更多 →
JSBSim完整教程:从零开始掌握开源飞行动力学仿真

JSBSim完整教程:从零开始掌握开源飞行动力学仿真

JSBSim完整教程:从零开始掌握开源飞行动力学仿真 【免费下载链接】jsbsim An open source flight dynamics & control software library 项目地址: https://gitcode.com/gh_mirrors/js/jsbsim JSBSim是一款功能强大的开源飞行动力学模型库,专…

2026/7/27 7:26:24 阅读更多 →
C# 程序结构

C# 程序结构

C# 环境设置C# 基本语法 C# - 程序结构更新于 2025/6/9 9:37:17 在学习 C# 编程语言的基本构建块之前,让我们先了解一下 C# 程序的最小结构,以便在接下来的章节中作为参考。 C# 程序的基本结构 C# 程序遵循简单的结构,包含必要的组件。基本程…

2026/7/27 7:26:24 阅读更多 →
公众号文章一直发,搜索排名却没变化

公众号文章一直发,搜索排名却没变化

你是这种情况吗?每天发文、每周更新,公众号后台显示“已发内容”越来越多,但搜索排名却一动不动,连自己搜都翻不到。pearbing很多人以为多发几篇就能把排名“压上去”。但认真告诉你,微信搜一搜的逻辑根本不是你想象的…

2026/7/27 7:25:24 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻