自動微分模塊

一.前言

本章節我們是要學習梯隊計算,?動微分(Autograd)模塊對張量做了進?步的封裝,具有?動求導功能。?動微分模塊是構成神經?絡 訓練的必要模塊,在神經?絡的反向傳播過程中,Autograd 模塊基于正向計算的結果對當前的參數進?微 分計算,從?實現?絡權重參數的更新。

二.梯度基本計算

我們使? backward ?法、grad 屬性來實現梯度的計算和訪問.

import torch# 1. 單標量梯度的計算
# y = x**2 + 20
def test01():# 定義需要求導的張量# 張量的值類型必須是浮點類型x = torch.tensor(10, requires_grad=True, dtype=torch.float64)# 變量經過中間運算f = x ** 2 + 20# ?動微分f.backward()# 打印 x 變量的梯度# backward 函數計算的梯度值會存儲在張量的 grad 變量中print(x.grad)# 2. 單向量梯度的計算# y = x**2 + 20def test02():# 定義需要求導張量x = torch.tensor([10, 20, 30, 40], requires_grad=True, dtype=torch.float64)# 變量經過中間計算f1 = x ** 2 + 20# 注意:# 由于求導的結果必須是標量# ? f 的結果是: tensor([120., 420.])# 所以, 不能直接?動微分# 需要將結果計算為標量才能進?計算f2 = f1.mean()  # f2 = 1/2 * x   2x/4# ?動微分f2.backward()# 打印 x 變量的梯度print(x.grad)if __name__ == '__main__':test01()test02()

tensor(20., dtype=torch.float64)
tensor([ 5., 10., 15., 20.], dtype=torch.float64)?

三.控制梯度計算?

我們可以通過?些?法使得在 requires_grad=True 的張量在某些時候計算不進?梯度計算。?

import torch# 1. 控制不計算梯度
def test01():x = torch.tensor(10, requires_grad=True, dtype=torch.float64)print(x.requires_grad)# 第?種?式: 對代碼進?裝飾with torch.no_grad():y = x ** 2print(y.requires_grad)# 第?種?式: 對函數進?裝飾@torch.no_grad()def my_func(x):return x ** 2print(my_func(x).requires_grad)# 第三種?式torch.set_grad_enabled(False)y = x ** 2print(y.requires_grad)# 2. 注意: 累計梯度
def test02():# 定義需要求導張量x = torch.tensor([10, 20, 30, 40], requires_grad=True, dtype=torch.float64)for _ in range(3):f1 = x ** 2 + 20f2 = f1.mean()# 默認張量的 grad 屬性會累計歷史梯度值# 所以, 需要我們每次?動清理上次的梯度# 注意: ?開始梯度不存在, 需要做判斷if x.grad is not None:x.grad.data.zero_()f2.backward()print(x.grad)# 3. 梯度下降優化最優解
def test03():# y = x**2x = torch.tensor(10, requires_grad=True, dtype=torch.float64)for _ in range(5000):# 正向計算f = x ** 2# 梯度清零if x.grad is not None:x.grad.data.zero_()# 反向傳播計算梯度f.backward()# 更新參數x.data = x.data - 0.001 * x.gradprint('%.10f' % x.data)if __name__ == '__main__':test01()# print('--------------------')# test02()# print('--------------------')# test03()

這里得分開打印,就不在展示結果了,大家打印一下看看。

四.梯度計算注意

當對設置 requires_grad=True 的張量使? numpy 函數進?轉換時, 會出現如下報錯:

Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.?

此時, 需要先使? detach 函數將張量進?分離, 再使? numpy 函數.?

注意: detach 之后會產??個新的張量, 新的張量作為葉?結點,并且該張量和原來的張量共享數據, 但是分 離后的張量不需要計算梯度。?

import torch# 1. detach 函數?法
def test01():x = torch.tensor([10, 20], requires_grad=True, dtype=torch.float64)# Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.# print(x.numpy())  # 錯誤print(x.detach().numpy())  # 正確# 2. detach 前后張量共享內存
def test02():x1 = torch.tensor([10, 20], requires_grad=True, dtype=torch.float64)# x2 作為葉?結點x2 = x1.detach()# 兩個張量的值?樣: 140421811165776 140421811165776print(id(x1.data), id(x2.data))x2.data = torch.tensor([100, 200])print(x1)print(x2)# x2 不會?動計算梯度: Falseprint(x2.requires_grad)if __name__ == '__main__':test01()test02()

結果展示:?

[10. 20.]
1834543349008 1834543349008
tensor([10., 20.], dtype=torch.float64, requires_grad=True)
tensor([100, 200])
False?

五.總結?

本?節主要講解了 PyTorch 中?常重要的?動微分模塊的使?和理解。我們對需要計算梯度的張量需要設 置 requires_grad=True 屬性,并且需要注意的是梯度是累計的,在每次計算梯度前需要先進?梯度清零。

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

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

相關文章

深度學習·目標檢測和語義分割基礎

邊緣框 不是標準的x,y坐標軸。邊緣框三種表示:左上右下下坐標,左上坐標長寬,中心坐標長寬 COCO 目標檢測數據集的格式:注意一個圖片有多個物體,使用csv或者文件夾結構的格式不可取。 錨框算法 生成很多…

ffmpeg音視頻處理大綱

FFmpeg 是一個功能強大的開源音視頻處理工具集,其核心代碼以 C 語言實現。下面從源碼角度分析 FFmpeg 如何實現轉碼、壓縮、提取、截取、拼接、合并和錄屏等功能: 一、FFmpeg 核心架構與數據結構 FFmpeg 的源碼結構圍繞以下核心組件展開: lib…

網絡安全小練習

一、docker搭建 1.安裝 2.改變鏡像源(推薦國內鏡像源:阿里云鏡像源) 登錄阿里云容器鏡像源服務( 阿里云登錄 - 歡迎登錄阿里云,安全穩定的云計算服務平臺 ) 復制系統分配的專屬地址 配置 sudo mkdir …

數據結構——順序表的相關操作

一、順序表基礎認知?1.順序表的定義與特點?順序表是數據結構中一種線性存儲結構,它將數據元素按照邏輯順序依次存儲在一片連續的物理內存空間中。簡單來說,就是用一段地址連續的存儲單元依次存放線性表的元素,且元素之間的邏輯關系通過物理…

2025最新國產用例管理工具評測:Gitee Test、禪道、藍凌測試、TestOps 哪家更懂研發協同?

在快節奏的 DevOps 時代,測試用例管理已不再是 QA 的獨角戲,而是穿透需求—開發—測試—交付全流程的核心樞紐。想象一下,如果用例結構混亂,覆蓋不全,甚至丟失版本變更歷史,不僅協作亂,還影響交…

在線評測系統開發交流

https://space.bilibili.com/700332132?spm_id_from333.788.0.0 實驗內容爬蟲Web系統設計數據分析實驗指導爬蟲Web系統設計自然語言處理與信息檢索數據可視化評分標準FAQ實驗二:在線評測系統實驗概述實驗內容Step1:題目管理Step2:題目評測S…

Linux操作系統從入門到實戰(十)Linux開發工具(下)make/Makefile的推導過程與擴展語法

Linux操作系統從入門到實戰(十)Linux開發工具(下)make/Makefile的推導過程與擴展語法前言一、 make/Makefile的推導過程1. 先看一個完整的Makefile示例2. make的工作流程(1)尋找Makefile文件(2&…

NFS磁盤共享

步驟:注意事項?:確保服務端防火墻關閉,或者允許2049端口通信,客戶端需具備讀寫權限。服務器端安裝NFS服務器:sudo apt-get install nfs-kernel-server # Debian/Ubuntu sudo yum install nfs-utils # Ce…

ORA-06413: 連接未打開

System.Data.OracleClient.OracleException:ORA-06413: 連接未打開 oracle 報錯 ORA-06413: 連接未打開 db.Open();的報錯鏈接未打開,System.Data.OracleClient.OracleException HResult0x80131938 MessageORA-06413: 連接未打開 關于ORA-06413錯誤(…

【PCIe 總線及設備入門學習專欄 5.1.2 -- PCIe EP core_rst_n 與 app_rst_n】

文章目錄 app_rst_n 和 core_rst_n 的作用1. core_rst_n — PCIe 控制器內部邏輯復位作用控制方式2. app_rst_n — 應用層/用戶邏輯復位作用特點兩者關系圖示:示例流程(Synopsys EP)rst_sync[3] 的作用詳解(復位同步邏輯)為什么使用 rst_sync[3]?圖示說明Synopsys 官方手…

Python初學者筆記第二十期 -- (文件IO)

第29節課 文件IO 在編程中,文件 I/O(輸入/輸出)允許程序與外部文件進行數據交互。Python 提供了豐富且易用的文件 I/O 操作方法,能讓開發者輕松實現文件的讀取、寫入和修改等操作。 IO交互方向 從硬盤文件 -> 讀取數據 -> 內…

Java JUC包概述

Java 的 java.util.concurrent(簡稱 JUC)包是 JDK 5 及以后引入的并發編程工具包,旨在解決傳統線程模型(如 synchronized、wait/notify)的局限性,提供更靈活、高效、可擴展的并發編程組件。它極大簡化了多線…

LeetCode--44.通配符匹配

前言:不知不覺又斷更一天了,其實昨天就把這道題寫得差不多了,只是剛好在力扣里面看見了一種新的解法,本來想寫出來的,但是我把它推到今天了,因為太晚了,但是今天又睡懶覺了,所以我直…

WHAT - 依賴管理工具 CocoaPods

文章目錄1. 什么是 CocoaPods?2. 如何安裝 CocoaPods?(1) 確保已安裝 Ruby(macOS 默認自帶)(2) 安裝 CocoaPods(3) 驗證安裝3. 在 React Native 項目中使用 CocoaPods(1) 進入 iOS 目錄(2) 初始化 Podfile(如果不存在&…

C++ Boost Aiso TCP 網絡聊天(服務端客戶端一體化)

代碼功能說明: 程序模式: 主動連接模式:當用戶指定對端 IP 和端口時,嘗試連接到對端被動監聽模式:當用戶未指定對端 IP 時,等待其他節點連接線程模型: 主線程:處理用戶輸入和消息發送接收線程:后臺接收并顯示對端消息關鍵組件: std::atomic<bool> connected:原…

WeakAuras 5.12.9 Ekkles lua

3.45獵人寶寶狼 技能恢復宏已知3.45BUG RL技能位會清空&#xff0c;小退大退 BB技能全部激活&#xff0c;修復以前可用宏一鍵恢復狀態-------方法一&#xff1a;宏命令---------------------------------------------------------#showtooltip 狂怒之嚎 /petautocaston [btn:1]…

對于編寫PID過程中的問題

當stm32RCT6使用位置環pid控制麥輪轉動一定路程時&#xff0c;在這個時間段內想讓一邊輪胎速度加大應該怎么做&#xff1f;比如我pid的目標脈沖值為9000&#xff0c;在運行到3000的時候車偏左了&#xff0c;那我應該怎樣讓他回正&#xff0c;我想到的辦法是增加其最大的脈沖值&…

LeetCode|Day13|88. 合并兩個有序數組|Python刷題筆記

LeetCode&#xff5c;Day13&#xff5c;88. 合并兩個有序數組&#xff5c;Python刷題筆記 &#x1f5d3;? 本文屬于【LeetCode 簡單題百日計劃】系列 &#x1f449; 點擊查看系列總目錄 >> &#x1f4cc; 題目簡介 題號&#xff1a;88. 合并兩個有序數組 難度&#xf…

【C++】初識C++(1)

個人主頁&#xff1a;我要成為c嘎嘎大王 希望這篇小小文章可以讓你有所收獲&#xff01; 目錄 前言 一、C的第一個程序 二、命名空間 2.1 namespace 的價值 2.2 namespace 的定義 2.2.1 正常的命名空間定義 2.2.2 命名空間可以嵌套 2.2.3 匿名命名空間 2.2.4 同名的name…

在新聞資訊 APP 中添加不同新聞分類頁面,通過 ViewPager2 實現滑動切換

在新聞資訊 APP 中添加不同新聞分類頁面&#xff0c;通過 ViewPager2 實現滑動切換 核心組件的作用 ViewPager2&#xff1a;是 ViewPager 的升級版&#xff0c;基于RecyclerView實現&#xff0c;支持水平 / 垂直滑動、RTL&#xff08;從右到左&#xff09;布局&#xff0c;且修…