神經網絡的層與塊

什么是層?什么是塊?

在深度學習中,層(Layer)?和塊(Block)?是構建神經網絡的核心概念,尤其在 PyTorch、TensorFlow 等框架中,二者既緊密關聯又有明確分工。理解它們的定義、關系和用法,是掌握神經網絡設計的基礎。

一、核心定義

1. 層(Layer)

層是神經網絡中最基本的計算單元,實現特定的數學操作(如線性變換、卷積、激活函數等)。

  • 功能單一:通常只完成一種特定計算(如nn.Linear實現線性變換y = Wx + bnn.ReLU實現激活函數y = max(0, x))。
  • 可復用性低:單個層一般不單獨使用,需與其他層組合才能完成復雜任務。
2. 塊(Block)

塊是由多個層(或其他塊)組合而成的復雜單元,封裝了一組相關的計算邏輯。

  • 功能復合:可以包含多個層(如 “卷積層 + 激活函數 + 池化層” 組成的卷積塊),甚至嵌套其他塊(如 ResNet 中的殘差塊包含多個卷積塊)。
  • 可復用性高:塊可以被看作 “超級層”,在網絡中重復使用(如 Transformer 中的 Encoder 塊被重復堆疊)。

二、本質關系:層是塊的 “原子”,塊是層的 “組合”

在 PyTorch 中,所有層和塊都繼承自nn.Module,因此它們在接口上保持一致(都有__init__初始化方法和forward前向傳播方法)。

  • 層是 “最小化的塊”:單個層(如nn.Linear)可以視為只包含一個計算步驟的特殊塊。
  • 塊是 “結構化的層集合”:塊通過組合多個層(或塊),實現更復雜的功能(如特征提取、殘差連接等)。

三、具體區別與聯系

維度層(Layer)塊(Block)
組成單一計算單元(如矩陣乘法、卷積)多個層 / 塊的組合(如 “線性層 + 激活函數 + dropout”)
功能實現基礎操作(如線性變換、非線性激活)實現復雜功能(如特征提取、殘差連接、注意力機制)
復用性低(通常作為塊的組成部分)高(可作為模塊重復嵌入到不同網絡中)
示例nn.Linearnn.Conv2dnn.ReLUnn.Sequential、ResNet 的殘差塊、Transformer 的 Encoder 塊

為什么需要自定義 Sequential?

雖然 PyTorch 已有nn.Sequential,但自定義版本有以下用途:

  1. 學習原理:理解 PyTorch 如何管理模塊和參數。
  2. 擴展功能:例如,添加日志記錄、中間輸出緩存等功能。
  3. 簡化接口:在特定場景下提供更簡潔的 API。

MySequentialnn.Sequential功能基本相同,有那些細微差異?

特性MySequentialnn.Sequential
模塊命名自動生成索引(如 "0", "1")可自定義名稱(如nn.Sequential(relu=nn.ReLU())
初始化方式接收任意數量的模塊接收多個模塊或有序字典
實現復雜度約 20 行代碼更復雜(支持更多特性)

完整代碼

"""
文件名: 5.1
作者: 墨塵
日期: 2025/7/13
項目名: dl_env
備注:  輸出結果不一樣,是因為Linear權值是隨機初始化的
"""
import torch
from torch import nn
from torch.nn import functional as F"""多層感知機,使用自定義塊實現"""
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)))"""自定義順序塊,按傳入順序連接多個模塊"""# MySequential的核心目標是:將多個層按傳入的順序連接起來,前一層的輸出作為后一層的輸入
class MySequential(nn.Module):def __init__(self, *args):"""初始化順序塊,接收任意數量的PyTorch模塊參數:*args: 任意數量的nn.Module子類實例(如nn.Linear, nn.ReLU等)"""# 調用父類nn.Module的構造函數,完成必要的初始化super().__init__()# 遍歷所有傳入的模塊for idx, module in enumerate(args):# 將模塊添加到PyTorch內置的有序字典_modules中# 鍵: 模塊的索引(字符串形式)# 值: 具體的模塊實例# _modules是nn.Module的特殊屬性,PyTorch會自動管理其中的所有模塊# 包括參數初始化、設備同步、序列化等self._modules[str(idx)] = moduledef forward(self, X):"""定義前向傳播邏輯,按順序依次調用所有模塊參數:X: 輸入張量返回:經過所有模塊處理后的輸出張量"""# 按_modules中保存的順序遍歷所有模塊# OrderedDict保證了遍歷時模塊的順序與添加時一致for block in self._modules.values():# 將輸入數據依次通過每個模塊# 前一個模塊的輸出直接作為下一個模塊的輸入X = block(X)# 返回最終輸出return X"""在前向傳播函數中執行代碼"""
class FixedHiddenMLP(nn.Module):def __init__(self):"""自定義神經網絡模塊,展示PyTorch中的特殊用法:1. 使用固定權重(訓練期間不更新)2. 層參數共享3. 前向傳播中的控制流"""super().__init__()# 創建固定權重矩陣(隨機初始化,但不參與訓練)# requires_grad=False:禁用梯度計算,訓練時權重不會更新self.rand_weight = torch.rand((20, 20), requires_grad=False)# 定義可訓練的線性層self.linear = nn.Linear(20, 20)def forward(self, X):"""定義前向傳播邏輯,包含非常規操作:1. 使用固定權重矩陣進行矩陣乘法2. 復用同一個線性層(參數共享)3. 使用while循環控制輸出規模"""# 第一層:可訓練的線性變換X = self.linear(X)# 第二層:使用固定隨機權重進行矩陣乘法,添加偏置1,再通過ReLU激活# torch.mm:矩陣乘法# self.rand_weight在訓練過程中保持不變X = F.relu(torch.mm(X, self.rand_weight) + 1)# 第三層:復用第一個線性層(參數共享)# 相當于兩個不同層共享同一組參數X = self.linear(X)# 控制流:如果張量X的絕對值之和大于1,則不斷將X除以2# 這是一個自定義的輸出規范化策略while X.abs().sum() > 1:X /= 2# 返回標量值:所有元素的和return X.sum()if __name__ == '__main__':"""多層感知機構建一個包含輸入層→隱藏層→輸出層的全連接神經網絡,對隨機生成的輸入數據進行計算并輸出結果。"""# 線性變換負責特征的線性映射,激活函數負責注入非線性,兩者交替使用才能讓網絡有能力學習復雜數據。# 傳播過程拆解:# 輸入X(形狀(2,20))→ 第 1 層線性變換 → 輸出X1(形狀(2,256))# X1→ 第 2 層 ReLU 激活 → 輸出X2(形狀(2,256),所有元素非負)# X2→ 第 3 層線性變換 → 輸出Y(形狀(2,10))# 1. 定義神經網絡# 這個前向傳播函數非常簡單: 它將列表中的每個塊連接在一起,將每個塊的輸出作為下一個塊的輸入。net = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))# 2. 生成輸入數據X = torch.rand(2, 20)# 3. 前向傳播并打印輸出print(net(X))"""自定義塊"""net = MLP()print(net(X))"""順序塊"""net = MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))print(net(X))"""在前向傳播函數中執行代碼"""net = FixedHiddenMLP()print(net(X))

實驗結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91468.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91468.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91468.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何用Qt寫一個安卓Android應用

對于不會安卓開發的同胞來講(比如我),想要做一個安卓應用(.apk)使用Qt是一個不錯的方法,今天就來聊聊如何使用Qt結合C寫一個安卓應用。 首先我們得擁有一個Qt,我使用的是5.14.2版本的,新版本可直接到qt官網去下載qt.io,老版本的現在qt官網不支…

泰語OCR識別技術方案

一、痛點分析1.1 泰語文字特性帶來的挑戰復雜字符集:泰語有44個輔音字母、15個元音符號、4個聲調符號和10個數字,組合形式多樣上下疊加結構:泰文字符常在垂直方向疊加組合,增加分割難度無詞間空格:泰語單詞間無明確分隔…

MER-Factory:多模態情感識別與推理數據集自動化工廠工具介紹

🛠? 工具 如果這個項目對你有幫助,歡迎給 https://github.com/Lum1104/MER-Factory/ 倉庫點一個 Star 🌟 ,這對我們幫助很大 MER-Factory 提供交互式工具來幫助您管理數據和配置處理流水線。 調優儀表板 調優儀表板 是一個基…

Python基礎數據結構詳解:字符串、列表、元組和字典的常用方法

目錄 一、引言:為什么學習這些數據結構? 二、字符串(String)的常用方法 1. 基本操作 2. 查找索引 3. 大小寫轉換 4. 位置調整 5. 開頭和結尾檢查 6. 分割和連接 7. 刪除空白字符 8. 類型判定 9. 替換內容 字符串小結 …

Liunx練習項目5.1-周期化任務;時間同步服務;

1.系統周期化任務1.1 at命令的用法at 時間 指定在規定的時間上執行相應的操作,完成操作crtlD完成編輯一分鐘后輸入的指令完成,創建了file{1..5}的文件at -l 查看系統上面所有用戶的調度at -c 可以查看該任務的指令at -d 加編號可以刪除該任務at -v 可以…

小皮面板搭建pikachu靶場

一、搭建所需的工具 1.下載小皮面板 下載地址為:小皮面板(phpstudy) - 讓天下沒有難配的服務器環境! 2.下載靶場所需的文件 下載地址為:https://github.com/zhuifengshaonianhanlu/pikachu 二、環境的搭建 打開小皮面板,使用所…

使用aiohttp實現高并發爬蟲

使用aiohttp來編寫一個高并發的爬蟲,想法很不錯,現實很骨感。這里我們要知道,由于高并發可能會對目標服務器造成壓力,請確保遵守目標網站的robots.txt,并合理設置并發量,避免被封IP。 我將通過示例代碼&…

【Linux庖丁解牛】— 信號量ipc管理!

1. 并發編程概念鋪墊> 多個執行流【進程】看到同一份資源:共享資源。> 被保護起來的資源叫做臨界資源。> 在進程中,涉及臨界資源的程序段叫做臨界區。【說人話就是程序中訪問共享資源的代碼】> 什么是互斥:任何時刻,只…

Spring Boot全局異常處理詳解

原代碼:package com.weiyu.exception;import com.weiyu.pojo.Result; import com.weiyu.utils.ErrorFileResponseUtils; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import …

FHE技術將徹底改變在線隱私保護方式

1. 在線隱私的簡史 互聯網剛剛誕生時,所有的內容都是未加密的。人們通過一個特定的地址訪問網站,這個地址以“HTTP”開頭。當時,這并不是什么大問題,因為人們在線訪問的都是內容,而這些內容本身已經是公開的。但隨著電…

Cursor配置Java環境、創建Spring Boot項目

一:配置JDK和Maven cursor默認會讀取環境變量JAVA_HOME和MAVEN_HOME,如果沒有配置去找默認路徑~/.m2/settings.xml也可以手動指定:Ctrl Shift P 輸入"Preferences:Open User Settings(JSON)"打開settings.json文件,然…

win11添加無線顯示器(兩個筆記本實現雙屏)

前置條件: 兩個筆記本要要支持無線顯示器,支持藍牙; 1、自己重裝的win11系統,首先根據網上說明進去的時候,紅色顯示無無線投屏; 2、安裝網上操作,查看自己電腦是否支持無線投屏(是支…

【MAC技巧】Bash/Zsh切換失敗的故障排除

【MAC技巧】Bash/Zsh切換失敗的故障排除 Troubleshooting to Failure " chsh: no changes made" By JacksonML 在Mac電腦中,終端(Terminal)是常用的命令行工具,對開發和運維至關重要。 依照蘋果電腦的系統軟件迭代,終端中存有B…

卷積神經網絡-卷積的分類

卷積的定義卷積是圖像處理中最核心的操作之一,其本質是通過卷積核(濾波器)與圖像進行滑動窗口計算(像素值乘積之和),實現對圖像特征的提取、增強或抑制。一、二維卷積--針對二維矩陣進行處理1.1單通道見得最…

全網首發:使用GIT下載時崩潰退出,是因為機械硬盤

前面有幾篇文章,說是GIT下載會退出。開始以為是虛擬機問題。把家里的虛擬機復制到公司,照樣崩潰。后來認為是內存不足。昨天在家里下載代碼,也崩潰退出。心里覺得奇怪,試了一次,還是退出。差別在哪里?之前是…

YAML 自動化用例中 GET vs POST 請求的參數寫法差異

GET 請求:用 params 傳參(附加在 URL 上) config:name: "GET 查詢用戶信息"base_url: "https://api.example.com"teststeps:- name: "根據 userId 查詢用戶信息"request:method: GETurl: /api/user/detailpara…

使用 SeaTunnel 建立從 MySQL 到 Databend 的數據同步管道

SeaTunnel 是一個非常易用、超高性能的分布式數據集成平臺,支持實時海量數據同步。 每天可穩定高效地同步數百億數據,已被近百家企業應用于生產,在國內較為普及。 Databend 是一款開源、彈性、低成本,基于對象存儲也可以做實時分…

linux服務器換ip后客戶端無法從服務器下載數據到本地問題處理

服務器換ip后客戶端無法從服務器下載數據到本地,根據上圖提示,讓用戶清理下~/.ssh/known_hosts文件,下載恢復正常。

從0到1實現Shell!Linux進程程序替換詳解

目錄從0到1實現Shell!Linux進程程序替換詳解 🚀引言:為什么進程需要"變身術"?一、程序替換:進程的"換衣服"魔法 🔄1.1 什么是程序替換?1.2 程序替換的原理:內存…

暑期算法訓練.2

目錄 6.力扣 11.盛水最多的容器 6.1 題目解析: 6.2 算法思路: 6.2.1 暴力解法: 6.2.2 優化算法: 6.3 代碼演示: ?編輯 6.4 總結反思: 7.力扣 611.有效的三角形個數 7.1 題目解析: 7.2…