PyTorch中的線性變換:nn.Parameter VS nn.Linear

self.weight = nn.Parameter(torch.randn(in_channels, out_channels))self.linear = nn.Linear(in_channels, out_channels) 并不完全一致,盡管它們都可以用于實現線性變換(即全連接層),但它們的使用方式和內部實現有所不同。

nn.Parameter

當手動創建一個 nn.Parameter 時,是在顯式地定義權重矩陣,并且需要自己管理這個參數以及它如何參與到計算中。例如:

self.weight = nn.Parameter(torch.randn(in_channels, out_channels))

這里,self.weight 是一個可學習的參數,可以將其視為模型的一部分,并在前向傳播過程中手動與輸入進行矩陣乘法運算。假設輸入是 x,則輸出可以這樣計算:

output = torch.matmul(x, self.weight)

注意這里的數學公式是 Y = X W Y = XW Y=XW,其中 X X X 是輸入矩陣, W W W 是權重矩陣。如果還需要加上偏置項 b b b,則變為 Y = X W + b Y = XW + b Y=XW+b。在這個例子中,需要另外定義并初始化偏置項 self.bias

示例 1:自定義實現線性層

import torch
import torch.nn as nnclass CustomLinear(nn.Module):def __init__(self, in_channels, out_channels):super(CustomLinear, self).__init__()# 初始化權重self.weight = nn.Parameter(torch.randn(in_channels, out_channels))# 初始化偏置self.bias = nn.Parameter(torch.randn(out_channels))def forward(self, x):# 線性變換:Y = XW + breturn torch.matmul(x, self.weight) + self.bias# 創建自定義線性層
custom_linear = CustomLinear(in_channels=3, out_channels=2)# 打印權重和偏置
print("Weights:", custom_linear.weight)
print("Bias:", custom_linear.bias)# 輸入數據
input_data = torch.randn(4, 3)  # 4個樣本,每個樣本有3個特征# 前向傳播
output = custom_linear(input_data)
print("Output:", output)

在這個示例中,我們手動創建了一個自定義的線性層 CustomLinear,它使用 nn.Parameter 來定義權重和偏置。在 forward 方法中,我們手動計算線性變換:Y = XW + b。這個實現與 nn.Linear 提供的功能類似,但更多地體現了手動管理權重和偏置的方式。

nn.Linear

另一方面,nn.Linear 是 PyTorch 提供的一個封裝好的模塊,用于執行線性變換。它不僅包含了權重矩陣,還自動處理了偏置項(除非明確設置 bias=False)。例如:

self.linear = nn.Linear(in_channels, out_channels)

當調用 self.linear(x) 時,它實際上是在執行以下操作:

output = torch.matmul(x, self.linear.weight.t()) + self.linear.bias

這里,self.linear.weight 的形狀是 (out_channels, in_channels),而不是直接 (in_channels, out_channels),因此在進行矩陣乘法之前需要對其轉置 (t() 方法)。這意味著數學公式實際上是 Y = X W T + b Y = XW^T + b Y=XWT+b,其中 W T W^T WT 表示權重矩陣的轉置。

示例 2:使用 nn.Linear

import torch
import torch.nn as nn# 定義一個線性層
linear_layer = nn.Linear(in_features=3, out_features=2)# 打印權重和偏置
print("Weights:", linear_layer.weight)
print("Bias:", linear_layer.bias)# 輸入數據
input_data = torch.randn(4, 3)  # 4個樣本,每個樣本有3個特征# 前向傳播
output = linear_layer(input_data)
print("Output:", output)

在這個示例中,我們創建了一個線性層,它接受一個形狀為 [4, 3] 的輸入數據,并將其映射到一個形狀為 [4, 2] 的輸出數據。linear_layer.weightlinear_layer.bias 是自動初始化的。

數學公式的對比

  • 對于手動定義的 nn.Parameter,如果輸入是 X X X (形狀為 [ N , i n _ c h a n n e l s ] [N, in\_channels] [N,in_channels]),權重是 W W W (形狀為 [ i n _ c h a n n e l s , o u t _ c h a n n e l s ] [in\_channels, out\_channels] [in_channels,out_channels]),那么輸出 Y Y Y 將通過 Y = X W Y = XW Y=XW 計算。

  • 對于 nn.Linear,同樣的輸入 X X X (形狀為 [ N , i n _ c h a n n e l s ] [N, in\_channels] [N,in_channels]),但是權重 W ′ W' W (形狀為 [ o u t _ c h a n n e l s , i n _ c h a n n e l s ] [out\_channels, in\_channels] [out_channels,in_channels]),輸出 Y Y Y 將通過 Y = X ( W ′ ) T + b Y = X(W')^T + b Y=X(W)T+b 計算。

從上面可以看出,雖然兩者都實現了線性變換,但在 nn.Linear 中,權重矩陣的形狀是倒置的,以適應其內部的實現細節。此外,nn.Linear 還自動處理了偏置項的添加,這使得它比手動定義參數更加方便和簡潔。

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

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

相關文章

鴻蒙生態日日新,夸克、順豐速運、駕校一點通等多款應用功能更新

3月5日鴻蒙生態日日新PLOG:吉事辦、健康甘肅等政務服務App上架原生鴻蒙應用市場;夸克、順豐速運、駕校一點通等多款應用功能更新。

基于SpringBoot的智慧停車場小程序(源碼+論文+部署教程)

運行環境 ? 前端:小程序 Vue ? 后端:Java ? IDE工具:IDEA(可自行選擇) HBuilderX 微信開發者工具 ? 技術棧:小程序 SpringBoot Vue MySQL 主要功能 智慧停車場微信小程序主要包含小程序端和…

致同報告:香港財政赤字加劇,擴大稅基與增收迫在眉睫

2月26日香港政府2025-26年度財政預算案,(以下簡稱“預算案”)發布,香港財政司司長陳茂波提出一系列旨在減少開支并振興香港經濟的措施,以應對日益增長的財政赤字。主要提案包括對所有公務員實施凍薪、針對性稅務寬減措…

在Spring Boot項目中分層架構

常見的分層架構包括以下幾層: 1. Domain 層(領域層) 作用:領域層是業務邏輯的核心,包含與業務相關的實體類、枚舉、值對象等。它是對業務領域的抽象,通常與數據庫表結構直接映射。 主要組件: 實體類(Entity):與數據庫表對應的Java類,通常使用JPA或MyBatis等ORM框架…

實訓任務2.2 使用Wireshark捕獲數據包并分析

目錄 【實訓目標】 【實訓環境】 【實訓內容】 【實訓步驟】 1.啟動WireShark 2. 使用Wireshark捕獲數據包 (1)選擇網絡接口 (2)捕獲數據包 (1)設置Wireshark過濾器并捕獲數據包 (2&…

工業自動化核心:BM100 信號隔離器的強大力量

安科瑞 呂夢怡 18706162527 BM100系列信號隔離器可以對電流、電壓等電量參數或溫度、電阻等非電量參數進行快速精確測量,經隔 離轉換成標準的模擬信號輸出。既可以直接與指針表、數顯表相接,也可以與自控儀表(如PLC)、各種 A/D …

并發編程——累加器

目錄 1 AtomicLong 1.1 核心功能 1.2 實現原理: (1)基于 Unsafe 的底層操作 (2) volatile字段的內存可見性 (3)CAS 操作與 ABA 問題 1.3 性能分析 1.4 使用場景 2 LongAdder 核心設計原理 1 分段存儲 2 分散更新策略 3.處理高競…

大模型管理工具:LLaMA-Factory

目錄 一、安裝與環境配置 二、?啟動 Web 界面 三、數據準備 四、模型訓練 五、模型評估 七、模型導出 八、API服務部署 LLaMA-Factory 是一個開源的大語言模型(LLM)微調框架,旨在簡化大規模模型的訓練、微調和部署流程。它支持多種主…

推流項目的ffmpeg配置和流程重點總結一下

ffmpeg的初始化配置,在合成工作都是根據這個ffmpeg的配置來做的,是和成ts流還是flv,是推動遠端還是保存到本地, FFmpeg 的核心數據結構,負責協調編碼、封裝和寫入操作。它相當于推流的“總指揮”。 先來看一下ffmpeg的…

大語言模型從理論到實踐(第二版)-學習筆記(緒論)

大語言模型的基本概念 1.理解語言是人工智能算法獲取知識的前提 2.語言模型的目標就是對自然語言的概率分布建模 3.詞匯表 V 上的語言模型,由函數 P(w1w2 wm) 表示,可以形式化地構建為詞序列 w1w2 wm 的概率分布,表示詞序列 w1w2 wm…

strace工具的交叉編譯

1、下載源碼 git clone https://github.com/strace/strace.git cd strace 2、運行 bootstrap 腳本(如果需要) 如果源碼中沒有 configure 腳本,運行以下命令生成: ./bootstrap 3. 配置編譯參數 運行 configure 腳本&#xff…

Vue 3 組件庫持續集成 (CI) 實戰:GitHub Actions 自動化測試與 Storybook 文檔構建 - 構建高效可靠的組件庫 CI 流程

引言 歡迎再次回到 Vue 3 + 現代前端工程化 系列技術博客! 在昨天的第十篇博客中,我們深入學習了代碼覆蓋率分析,掌握了利用 Jest 代碼覆蓋率報告提升單元測試有效性的方法,進一步鞏固了組件庫的質量防線。 今天,我們將邁向 自動化流程 的構建,聚焦于 持續集成 (Continu…

無穿戴動捕數字人互動方案 | 暢享零束縛、高沉浸的虛實交互體驗

在數字化浪潮席卷而來的當下,虛擬人互動體驗正逐漸成為各領域的新寵。長久以來,虛擬人驅動主要依靠穿戴式動作捕捉設備,用戶需要通過佩戴傳感器或標記點來實現動作捕捉。然而,隨著技術的不斷突破,一種全新的無穿戴動作…

03 HarmonyOS Next儀表盤案例詳解(二):進階篇

溫馨提示:本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦! 文章目錄 前言1. 響應式設計1.1 屏幕適配1.2 彈性布局 2. 數據展示與交互2.1 數據卡片渲染2.2 圖表區域 3. 事件處理機制3.1 點擊事件處理3.2 手勢…

python-leetcode-統計構造好字符串的方案數

2466. 統計構造好字符串的方案數 - 力扣(LeetCode) 這個問題可以用**動態規劃(DP)**來解決,思路如下: 思路 1. 定義 DP 數組 設 dp[i] 表示長度為 i 的好字符串的個數。 2. 狀態轉移方程 我們可以在 dp…

MySQL------存儲引擎和用戶和授權

9.存儲引擎 1.兩種引擎 MyISAM和InnoDB 2.兩種區別 1.事務: MyISAM不支持事務 2.存儲文件: innodb : frm、ibd MyISAM: frm、MYD、MYI 3.數據行鎖定: MyISAM不支持 4.全文索引: INNODB不支持,所以MYISAM做select操作速度很快 5.外鍵約束: MyISAM…

題海拾貝:P9241 [藍橋杯 2023 省 B] 飛機降落

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《題海拾貝》 歡迎點贊&#xff0c;關注&#xff01; 1、題…

刪除有序數組中的重復項(js實現,LeetCode:26)

給你一個 非嚴格遞增排列 的數組 nums &#xff0c;請你原地刪除重復出現的元素&#xff0c;使每個元素只出現一次&#xff0c;返回刪除后數組的新長度。元素的相對順序應該保持一致。然后返回 nums 中唯一元素的個數。 考慮 nums 的唯一元素的數量為 k &#xff0c;你需要做以…

3-9 WPS JS宏單元格復制、重定位應用(拆分單表到多表)

************************************************************************************************************** 點擊進入 -我要自學網-國內領先的專業視頻教程學習網站 *******************************************************************************************…

大白話react第十六章React 與 WebGL 結合的實戰項目

大白話react第十六章React 與 WebGL 結合的實戰項目 1. 項目簡介 React 是一個構建用戶界面的強大庫&#xff0c;而 WebGL 則允許我們在網頁上實現高性能的 3D 圖形渲染。將它們結合起來&#xff0c;我們可以創建出炫酷的 3D 網頁應用&#xff0c;比如 3D 產品展示、虛擬場景…