小白的進階之路系列之七----人工智能從初步到精通pytorch自動微分優化以及載入和保存模型

本文將介紹Pytorch的以下內容

自動微分函數

優化

模型保存和載入

好了,我們首先介紹一下關于微分的內容。

在訓練神經網絡時,最常用的算法是反向傳播算法。在該算法中,根據損失函數相對于給定參數的梯度來調整參數(模型權重)。

為了計算這些梯度,PyTorch有一個內置的微分引擎,名為torch.autograd。它支持任何計算圖的梯度自動計算。

考慮最簡單的單層神經網絡,輸入x,參數w和b,以及一些損失函數。它可以在PyTorch中以以下方式定義:

import torchx = torch.ones(5)  # input tensor
y = torch.zeros(3)  # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w)+b
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)

張量、函數與計算圖

這段代碼定義了以下計算圖:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

在這個網絡中,w和b是我們需要優化的參數。因此,我們需要能夠計算損失函數相對于這些變量的梯度。為了做到這一點,我們設置了這些張量的requires_grad屬性。

我們應用于張量來構造計算圖的函數實際上是函數類的對象。該對象知道如何在正向方向上計算函數,以及如何在反向傳播步驟中計算其導數。對反向傳播函數的引用存儲在張量的grad_fn屬性中。您可以在文檔中找到Function的更多信息。

print(f"Gradient function for z = {z.grad_fn}")
print(f"Gradient function for loss = {loss.grad_fn}")

輸出為:

Gradient function for z = <AddBackward0 object at 0x0000022EDB445C30>
Gradient function for loss = <BinaryCrossEntropyWithLogitsBackward0 object at 0x0000022EDB445D20>

計算梯度

為了優化神經網絡中參數的權重,我們需要計算損失函數對參數的導數,即我們需要?loss/?w和?loss/?B。為了計算這些導數,我們調用loss.backward(),然后從w.g grad和b.g grad中檢索值:

loss.backward()
print(w.grad)
print(b.grad)

輸出為:

tensor([[0.0549, 0.1796, 0.0399],[0.0549, 0.1796, 0.0399],[0.0549, 0.1796, 0.0399],[0.0549, 0.1796, 0.0399],[0.0549, 0.1796, 0.0399]])
tensor([0.0549, 0.1796, 0.0399])

禁用梯度跟蹤

默認情況下,所有requires_grad=True的張量都在跟蹤它們的計算歷史并支持梯度計算。然而,在某些情況下,我們不需要這樣做,例如,當我們訓練了模型,只想將其應用于一些輸入數據時,即我們只想通過網絡進行前向計算。我們可以通過使用torch.no_grad()塊包圍我們的計算代碼來停止跟蹤計算:

z = torch.matmul(x, w)+b
print(z.requires_grad)with torch.no_grad():z = torch.matmul(x, w)+b
print(z.requires_grad)

輸出為:

True
False

實現相同結果的另一種方法是在張量上使用detach()方法:

z = torch.matmul(x, w)+b
z_det = z.detach()
print(z_det.requires_grad)

輸出為:

False

你可能想要禁用漸變跟蹤的原因如下:

  • 將神經網絡中的一些參數標記為凍結參數。

  • 當你只做正向傳遞時,為了加快計算速度,因為在不跟蹤梯度的張量上的計算會更有效率。

更多關于計算圖的知識

從概念上講,autograd在由Function對象組成的有向無環圖(DAG)中保存數據(張量)和所有執行的操作(以及產生的新張量)的記錄。在DAG中,葉是輸入張量,根是輸出張量。通過從根到葉的跟蹤圖,您可以使用鏈式法則自動計算梯度。

在向前傳遞中,autograd同時做兩件事:

  • 運行請求的操作來計算結果張量

  • 在DAG中維持操作的梯度函數。

當在DAG根上調用.backward()時,向后傳遞開始。autograd:

  • 計算每個。grad_fn的梯度,

  • 在各自張量的.grad屬性中累積它們

  • 利用鏈式法則,一直傳播到葉張量。

[!TIP]

PyTorch中的dag是動態的,需要注意的重要一點是圖形是從頭開始重新創建的;在每次.backward()調用之后,autograd開始填充一個新圖。這正是允許您在模型中使用控制流語句的原因;如果需要,您可以在每次迭代中更改形狀、大小和操作

張量梯度和雅可比積

在很多情況下,我們有一個標量損失函數,我們需要計算關于一些參數的梯度。然而,在某些情況下,輸出函數是一個任意張量。在這種情況下,PyTorch允許你計算所謂的雅可比積,而不是實際的梯度。

inp = torch.eye(4, 5, requires_grad=True)
out = (inp+1).pow(2).t()
out.backward(torch.ones_like(out), retain_graph=True)
print(f"First call\n{inp.grad}")
out.backward(torch.ones_like(out), retain_graph=True)
print(f"\nSecond call\n{inp.grad}")
inp.grad.zero_()
out.backward(torch.ones_like(out), retain_graph=True)
print(f"\nCall after zeroing gradients\n{inp.grad}")

輸出為:

First call
tensor([[4., 2., 2., 2., 2.],[2., 4., 2., 2., 2.],[2., 2., 4., 2., 2.],[2., 2., 2., 4., 2.]])Second call
tensor([[8., 4., 4., 4., 4.],[4., 8., 4., 4., 4.],[4., 4., 8., 4., 4.],[4., 4., 4., 8., 4.]])Call after zeroing gradients
tensor([[4., 2., 2., 2., 

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

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

相關文章

【圖像處理基石】立體匹配的經典算法有哪些?

1. 立體匹配的經典算法有哪些&#xff1f; 立體匹配是計算機視覺中從雙目圖像中獲取深度信息的關鍵技術&#xff0c;其經典算法按技術路線可分為以下幾類&#xff0c;每類包含若干代表性方法&#xff1a; 1.1 基于區域的匹配算法&#xff08;Local Methods&#xff09; 通過…

《Map 到底適合用哪個?HashMap、TreeMap、LinkedHashMap 對比實戰》

大家好呀&#xff01;今天我們來聊聊Java中超級重要的Map集合家族 &#x1f3a2;。Map就像是一個神奇的魔法口袋&#xff0c;可以幫我們把東西&#xff08;值&#xff09;和標簽&#xff08;鍵&#xff09;一一對應存放起來。不管你是Java新手還是老司機&#xff0c;掌握Map都是…

TencentOSTiny

開放原子開源基金會 騰訊物聯網終端操作系統 _物聯網操作系統_物聯網OS_TencentOS tiny-騰訊云 GitHub - OpenAtomFoundation/TobudOS: 開放原子開源基金會孵化的物聯網操作系統&#xff0c;捐贈前為騰訊物聯網終端操作系統TencentOS Tiny 項目簡介 TencentOS Tiny 是騰訊…

使用 Selenium 進行自動化測試:入門指南

在現代軟件開發中&#xff0c;自動化測試已經成為不可或缺的一部分。它不僅提高了測試效率&#xff0c;還減少了人為錯誤的可能性。Selenium 是一個強大的開源工具&#xff0c;廣泛用于 Web 應用程序的自動化測試。本文將詳細介紹如何使用 Selenium 進行自動化測試&#xff0c;…

C54-動態開辟內存空間

1.malloc 原型&#xff1a;void* malloc(size_t size);&#xff08;位于 <stdlib.h> 頭文件中&#xff09; 作用&#xff1a;分配一塊連續的、未初始化的內存塊&#xff0c;大小為 size 字節。 返回值&#xff1a; 成功&#xff1a;返回指向分配內存首地址的 void* 指針…

ELK服務搭建-0-1搭建記錄

ELK搭建 需要準備一臺linux服務器&#xff08;最好是CentOS7&#xff09;,內存至少4G以上&#xff08;三個組件都比較占用內存&#xff09; 演示基于ElasticSearch采用的是8.5.0版本 1、 Docker安裝Elasticsearch 創建一個網絡 因為我們還需要部署kibana容器、logstash容器&am…

調參指南:如何有效優化模型訓練效果

?? 調參指南:如何有效優化模型訓練效果(深度學習實戰) 模型跑通不難,調得好才是本事。本篇文章將系統講解如何在訓練過程中有效調參,從學習率到網絡結構,從損失函數到正則化,讓你的模型效果“飛升”。 ?? 一、為什么需要調參? 初學者常常以為模型訓練完就“任務完…

laya3的2d相機與2d區域

2d相機和2d區域都繼承自Sprite。 2d相機必須作為2d區域的子節點&#xff0c;且2d相機必須勾選isMain才能正常使用。 2d區域下如果沒有主相機&#xff0c;則他和Sprite無異&#xff0c;他的主要操作皆是針對主相機。 2d相機可以調整自己的移動范圍&#xff0c;是否緊密跟隨&a…

【保姆級教程】Windows部署LibreTV+cpolar實現遠程影音庫訪問全步驟

文章目錄 前言1.關于LibreTV2.docker部署LibreTV3.簡單使用LibreTV4.安裝cpolar內網穿透5.配置ward公網地址6.配置固定公網地址總結 前言 當周末的閑暇時光來臨時&#xff0c;您是否也習慣性地癱倒在沙發上&#xff0c;渴望通過影視作品緩解一周的疲憊&#xff1f;然而在準備點…

Windows安裝Docker部署dify,接入阿里云api-key進行rag測試

一、安裝docker 1.1 傻瓜式安裝docker Get Docker | Docker Docs Docker原理&#xff08;圖解秒懂史上最全&#xff09;-CSDN博客 官網選擇好windows的安裝包下載&#xff0c;傻瓜式安裝。如果出現下面的報錯&#xff0c;說明主機沒有安裝WSL 1.2 解決辦法 安裝 WSL | Mic…

Cursor 與DeepSeek的完美契合

這兩天在看清華大學最近出的一個關于deepseek入門的官方視頻中&#xff0c;看了幾個deepseek的應用場景還是能夠感覺到它的強大之處的&#xff0c;例如根據需求生成各種markdown格式的代碼&#xff0c;再結合市面上已有的一些應用平臺生成非常好看的流程圖&#xff0c;PPT,報表…

【深度學習】13. 圖神經網絡GCN,Spatial Approach, Spectral Approach

圖神經網絡 圖結構 vs 網格結構 傳統的深度學習&#xff08;如 CNN 和 RNN&#xff09;在處理網格結構數據&#xff08;如圖像、語音、文本&#xff09;時表現良好&#xff0c;因為這些數據具有固定的空間結構。然而&#xff0c;真實世界中的很多數據并不遵循網格結構&#x…

[Python] 避免 PyPDF2 寫入 PDF 出現黑框問題:基于語言自動匹配系統字體的解決方案

在使用 Python 操作 PDF 文件時,尤其是在處理中文、日語等非拉丁字符語言時,常常會遇到一個令人頭疼的問題——文字變成“黑框”或“方塊”,這通常是由于缺少合適的字體支持所致。本文將介紹一種自動選擇系統字體的方式,結合 PyPDF2 模塊解決此類問題。 一、問題背景:黑框…

Java求職面試:從核心技術到AI與大數據的全面考核

Java求職面試&#xff1a;從核心技術到AI與大數據的全面考核 第一輪&#xff1a;基礎框架與核心技術 面試官&#xff1a;謝飛機&#xff0c;咱們先從簡單的開始。請你說說Spring Boot的啟動過程。 謝飛機&#xff1a;嗯&#xff0c;Spring Boot啟動的時候會自動掃描組件&…

Espresso 是什么

Espresso 是 Android 開發者的首選 UI 測試工具&#xff0c;是 Google 官方推出的 Android 應用 UI 測試框架&#xff0c;專為 白盒測試 設計&#xff0c;強調 速度快、API 簡潔&#xff0c;適合開發者在編寫代碼時同步進行自動化測試。它是 Android Jetpack 測試工具的一部分&…

Axios 如何通過配置實現通過接口請求下載文件

前言 今天&#xff0c;我寫了 《Nodejs 實現 Mysql 數據庫的全量備份的代碼演示》 和 《NodeJS 基于 Koa, 開發一個讀取文件&#xff0c;并返回給客戶端文件下載》 兩篇文章。在這兩篇文章中&#xff0c;我實現了數據庫的備份&#xff0c;和提供數據庫下載等接口。 但是&…

IDEA項目推送到遠程倉庫

打開IDEA——>VCS——>Creat Git 選擇項目 push提交到本地 創建遠程倉庫 復制地址 定義遠程倉庫 推送 推送成功

Prompt工程:解鎖大語言模型的終極密鑰

Prompt工程&#xff1a;解鎖大語言模型的終極密鑰 一、引言&#xff1a;Prompt的戰略價值重構 在人工智能技術加速滲透的2025年&#xff0c;Prompt&#xff08;提示詞&#xff09;作為連接人類意圖與大語言模型&#xff08;LLM&#xff09;的核心接口&#xff0c;其戰略地位已…

架構意識與性能智慧的雙重修煉

架構意識與性能智慧的雙重修煉 ——現代軟件架構師的核心能力建設指南 作者:藍葛亮 ??引言 在當今快速發展的技術環境中,軟件架構師面臨著前所未有的挑戰。隨著業務復雜度的不斷增長和用戶對性能要求的日益嚴苛,如何在架構設計中平衡功能實現與性能優化,已成為每個技術…

Flutter下的一點實踐

目錄 1、背景2、refena創世紀代碼3、localsend里refena的刷新3.1 初始狀態3.2 發起設備掃描流程3.3 掃描過程3.3 刷新界面 4.localsend的設備掃描流程4.1 UDP廣播設備注冊流程4.2 TCP/HTTP設備注冊流程4.3 localsend的服務器初始化工作4.4總結 1、背景 在很久以前&#xff0c;…