第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/10/24 19:49:57 阅读更多 →
涂胶显影机(Track)初级工程师面试打分卡

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

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

2026/10/24 13:09:36 阅读更多 →
6个Prompt设计方法提升AI编程效率

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

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

2026/10/24 19:50:58 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/24 11:09:31 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/24 17:47:00 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/24 18:34:36 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/24 9:46:55 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/25 3:12:30 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/24 21:09:59 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/24 9:15:56 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/24 11:09:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 7:47:32 阅读更多 →