Pytorch框架——自動微分和反向傳播

一、自動微分概念

自動微分(Automatic Differentiation,AD)是一種利用計算機程序自動計算函數導數的技術,它是機器學習和優化算法中的核心工具(如神經網絡的梯度下降),通過反向傳播計算并更新梯度。

計算梯度的目的是更新權重w和b,\theta _{1}=\theta _{0}-lr*value,其中value是梯度值,學習率需要提前指定,求導計算梯度,前面我們學過了手動求導,這次使用自動微分的方法,來簡化我們的工作量。

注意:

1. w和b一定是可自動微分的張量,類型是浮點型,超參數requries_grad=Ture表示允許自動微分。

2. detach():自動微分的張量不能轉換成numpy數組, 通過 張量.detach().numpy() 剝離成不自動微分后可以轉換。detach()返回一個與當前張量共享數據的新張量,該張量是不開啟自動微分的,不參與梯度計算。

? ? clone():返回一個與當前張量數據相同的新張量,默認開啟自動微分,但新張量擁有獨立的存儲。

3. 默認梯度是累加的,所以多輪中每個輪次需要在自動微分之前進行清零!!!

4. 查看張量底層數據地址時推薦使用 張量名.data_ptr()?

import torch# TODO 單輪
#定義權重,并開啟自動微分
w = torch.tensor([10,20],requires_grad=Ture,dtype=torch.float)
#定義損失函數(loss,cost,criterion...)
loss = 2 * w**2
#自動微分求梯度,自動更新梯度
loss.sun().backward()
#手動更新權重
w.data = w.data - 0.01*w.grad# TODO 多輪
#定義權重,并開啟自動微分
w = torch.tensor([10,20],requires_grad=Ture,dtype=torch.float)
#定義遍歷輪次
epochs = 500
for epoch in range(epochs):loss = 2 * w**2# 默認梯度是累加的,所以每輪需要在自動微分之前進行清零if w.grad is not None:w.grad.zero_()loss.sum().backward()# 格式化輸出print(f"當前輪次:{epoch + 1} 當前權重: {w.data},固定學習率:{0.01} 更新后梯度: {w.grad},下一個權重: {w.data - 0.01 * w.grad}")#手動更新權重w.data = w.data - 0.01*w.grad

推導w和b的方法:

import torch
x = torch.ones(2, 5)
y = torch.zeros(2, 3)
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)# 1.首先獲取損失函數
loss_fn = torch.nn.MSELoss()
# 2.然后,計算預測值-> z=wx+b 注意: 這里面的wx是矩陣乘法,需要遵循 (n,m)*(m,p)=(n,p)
z = x.matmul(w) + b
# 3.接著,根據損失函數計算損失值
loss = loss_fn(z, y)
# 4.最后,反向傳播推導更新梯度
loss.sum().backward()# 5.打印結果
print(f'w.grad: {w.grad}')
print(f'b.grad: {b.grad}')

二、 反向傳播及案例

正向傳播:從輸入到輸出,目的是預測結果和損失值;

反向傳播:從輸出到輸入,更新參數做出優化。

案例:使用pytorch構建一個回歸模型

步驟:

1.獲取數據集,提前封裝數據為張量

2.模型訓練預測以及計算損失值

3.繪制損失曲線以及預測和真實值的擬合線

from sklearn.datasets import make_regression
import torch
from torch.utils.data import DataLoader, TensorDataset
from torch.nn import Linear, MSELoss
from torch.optim import SGD
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 1.獲取數據集,提前封裝成張量
def get_data():X,y,coef = make_regressionn(n_samples=100,n_features=1,n_targets=1,noise=10,random_state=1,coef=Ture,bias=14.5)X = torch.tensor(X,dtype=torch.float32)y = torch.tensor(y,dtype=torch.float32)return X,y,coef# 2.模型訓練預測及損失值計算
def get_model_and_loss_list(x, y, epochs):# 2.1 處理數據封裝為數據加載器,為了分批次訓練,避免內存溢出dataloader = DataLoader(TensorDataset(x,y),batch_size = 5,shuffle=Ture)# 2.2 創建模型對象,為了模型預測model = Linear(in_features=1,out_features=1)# 2.3 創建損失函數對象,為了計算損失值loss_fn = MSELoss()# 2.4 創建SGD優化器對象,為了更新模型參數optimizer = SGD(model.parameters(),lr=0.03)# 2.5 模型訓練預測和計算損失# 2.5.1 定義一個空列表,用于保存每輪損失值,再定義累加損失和批次,用于計算每輪的損失值loss_list,total_loss,batch_cnt = [],0.0,0# for循環,外循環輪次,內循環批次for epoch in range(epochs):for batch_x,batch_y in dataloader:# [重點] 正向傳播# 計算預測值y_predict = model(batch_x)# 計算損失值,MSE計算要求形狀必須一致,否則自動廣播會出現無效計算loss = loss_fn(y_predict,batch_y.reshape(-1,1))# 累加損失和批次total_loss += loss.item()batch_cnt += 1# [重點] 反向傳播# 梯度清零optimizer.zero_grad()# 梯度計算loss.backward()# 參數更新 step()底層是w1 = w0-lr*梯度optimizer.step()# TODO 內層循環結束,即一輪結束,可以計算每輪損失值,并保存到列表中epoch_loss = total_loss / batch_cntloss_list.append(epoch_loss)print(f"第{epoch + 1}輪,損失值為:{epoch_loss:.2f}")# TODO 外層循環結束,即所有輪次結束,可以返回模型和損失值列表# 打印模型參數字典print(f"模型參數:{model.state_dict()}")# print(f"模型權重:{model.weight}, 偏置:{model.bias}")# 返回結果return model, loss_list# 3.繪制損失曲線及預測和真實值擬合線
def plot_show(epochs, model, loss_list, x, y, coef):# todo 1.繪制每輪損失曲線plt.plot(range(epochs), loss_list)plt.xlabel('訓練的輪數')plt.ylabel('該輪的平均損失')plt.title('損失變化曲線圖')plt.grid()plt.show()#  todo 2.繪制預測和真實值擬合線plt.scatter(x, y)# 使用x的最小值,最大值生成1000個x值等差張量X = torch.linspace(x.min(), x.max(), 1000)# 細節:  numpy * 張量 -> 不可以     張量 * numpy -> 可以, 要么把v放到前面位置要么把coef轉為張量y_pred = torch.tensor([v * model.weight + model.bias for v in X])y_true = torch.tensor([v * coef + 14.5 for v in X])plt.plot(X, y_pred, label='訓練', color='red')plt.plot(X, y_true, label='真實', color='green')plt.legend()plt.grid()plt.show()if __name__ =='__main__':# 1.獲取數據集,提前封裝數據為張量x, y, coef = get_data()# 2.模型訓練預測以及計算損失值epochs = 4000model, loss_list = get_model_and_loss_list(x, y, epochs)# 3.繪制損失曲線以及預測和真實值擬合線plot_show(epochs, model, loss_list, x, y, coef)

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

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

相關文章

【Linux手冊】進程的狀態:從創建到消亡的“生命百態”

目錄 前言 操作系統進程狀態 運行狀態 阻塞狀態 掛起狀態 Linux中具體的進程狀態 R(running)運行狀態 S(sleeping)阻塞狀態 D(disk sleep)磁盤休眠狀態 T(stopped)和t(tracing stop) X(dead)終止狀態 Z(zombie)僵尸狀態 僵尸進程的危害 前言 我們在運行可執行程序…

李沐--動手學深度學習 LSTM

1.從零開始實現LSTM #從零開始實現長短期記憶網絡 import torch from torch import nn from d2l import torch as d2l#加載時光機器數據集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps)#1.定義和初始化模型參數&#xff…

面經的疑難雜癥

1.介紹一下虛擬地址,虛擬地址是怎么映射到物理地址的? 虛擬地址是指在采用虛擬存儲管理的操作系統中,進程訪問內存時所使用的地址。每個進程都有獨立的虛擬地址空間,虛擬地址通過操作系統和硬件(如MMU,內存…

去噪擴散概率模型(DDPM)全解:從數學基礎到實現細節

一、 概述 在這篇博客文章中,我們將深入探討去噪擴散概率模型(也被稱為 DDPMs,擴散模型,基于得分的生成模型,或簡稱為自動編碼器),這可以說是AIGC最近幾年飛速發展的基石,如果你想做…

【系統分析師】2011年真題:案例分析-答案及詳解

文章目錄 試題1【問題 1】【問題 2】【問題 3】 試題2【問題 1】【問題 2】【問題 3】 試題3【問題 1】【問題 2】【問題 3】 試題4【問題 1】【問題 2】【問題 3】 試題5【問題 1】【問題 2】【問題 3】 試題1 隨著寬帶應用快速發展,用戶要求系統服務提供商提供基…

【unitrix】 1.7 規范化常量類型結構(standardization.rs)

一、源碼 這段代碼實現了一個二進制數字標準化系統,用于將二進制數字類型(B0/B1)轉換為更簡潔的表示形式。 //! 二進制數字標準化模塊 / Binary Number Normalization Module //! //! 提供將二進制數字(B0/B1)標準化為更簡潔表示形式的功能…

NJet Portal 應用門戶管理介紹

nginx向云原生演進,All in OpenNJet! 1. 應用門戶簡介 NJet 應用引擎是基于 Nginx 的面向互聯網和云原生應用提供的運行時組態服務程序,作為底層引擎,NJet 實現了NGINX 云原生功能增強、安全加固和代碼重構,利用動態加…

uni-app學習筆記三十六--分段式選項卡組件的使用

先來看效果: 上圖有3個選項卡(PS:uniapp官方稱之為分段器,我還是習慣叫選項卡),需要實現點擊不同的選項卡時下方切換顯示對應的數據。 下面介紹下實現的過程。 1.在uniapp官方文檔下載并安裝該擴展組件:u…

Qt:Qt桌面程序正常退出注意事項

一般情況下,Qt窗體的創建和顯示命令如下: Main_window main_window; main_window.show(); 主窗體中設置屬性Qt::WA_DeleteOnClose setAttribute(Qt::WA_DeleteOnClose); 則在main.cpp中可以將窗體創建為指針,這樣在退出時可以正確釋放指針…

【arXiv2024】時間序列|TimesFM-ICF:即插即用!時間序列預測新王者!吊打微調!

論文地址:https://arxiv.org/pdf/2410.24087 代碼地址:https://github.com/uctb/TSFM 為了更好地理解時間序列模型的理論與實現,推薦參考UP “ThePPP時間序列” 的教學視頻。該系列內容系統介紹了時間序列相關知識,并提供配套的論…

從0開始學習語言模型--Day02-如何最大化利用硬件

如何利用硬件 這個單元分為內核、并行處理和推理。 內核(Kernels) 我們說的內核一般指的就是GPU,這是我們用于計算的地方,一般說的計算資源就指的是GPU的大小。我們模型所用的數據和參數一般存儲在內存里,假設把內存…

ElasticSearch配置詳解:設置內存鎖定的好處

什么是內存鎖定 "bootstrap": {"memory_lock": "true" }內存鎖定是指將Elasticsearch的JVM堆內存鎖定在物理內存中,防止操作系統將其交換(swap)到磁盤。 內存交換是操作系統的虛擬內存管理機制,當…

成功解決 ValueError: Unable to find resource t64.exe in package pip._vendor.distlib

解決問題 我們在本地的命令行中運行指令"python -m pip install --upgrade pip"的時候,報了如下的錯誤: 解決思路 我們需要重新安裝一下pip。 解決方法 步驟1: 通過執行下面的指令刪除本地的pip: python -m pip uninstall pip…

倉庫物資出入庫管理系統源碼+uniapp小程序

一款基于ThinkPHPuniapp開發的倉庫物資出入庫管理系統,適用于單位內部物資采購、發放管理的庫存管理系統。提供全部無加密源碼,支持私有化部署。 更新日志: 新增 基于UNIAPP開發的手機端,適配微信小程序 新增 字典管理 新增頁面…

基于機器學習的逐巷充填開采巖層運動地表沉降預測

基于機器學習的逐巷充填開采巖層運動地表沉降預測 1. 項目概述 本報告詳細介紹了使用Python和機器學習技術預測逐巷充填開采過程中地表沉降的方法。通過分析地質參數、開采參數和充填參數,構建預測模型評估地表沉降風險。 # 導入必要的庫 import numpy as np import pandas…

MotleyCrew ——拋棄dify、coze,手動搭建多agent工作流

1. MotleyCrew 核心組件 - 協調器: Crew MotleyCrew 的核心是一個 “Crew” 對象,即多代理系統的指揮者。Crew 持有一個全局的知識圖譜(使用 Kuzu 圖數據庫),用于記錄所有任務、任務單元和其執行狀態。 Cr…

掌握這些 Python 函數,讓你的代碼更簡潔優雅

在 Python 編程世界里,代碼的簡潔性與可讀性至關重要。簡潔優雅的代碼不僅便于自己后期維護,也能讓其他開發者快速理解邏輯。而 Python 豐富的內置函數和一些實用的第三方庫函數,就是實現這一目標的有力武器。接下來,就為大家介紹…

簡說ping、telnet、netcat

簡說 ping 和 telnet 命令的作用、用法和區別,方便理解它們在網絡診斷中的用途。 🌐 ping 命令 ? 作用: ping 用于檢測網絡連通性。它通過向目標主機發送 ICMP Echo 請求 并等待回應,從而判斷目標主機是否可達,并測…

基于STM32的超聲波模擬雷達設計

一、雷達概述 雷達(Radio Detection and Ranging,無線電探測與測距)是一種利用電磁波探測目標位置、速度等信息的主動式傳感器系統。其基本原理是發射電磁波并接收目標反射的回波,通過分析回波的時間差、頻率變化等參數&#xff0…

飛書多維表格利用 Amazon Bedrock AI 能力賦能業務

背景 飛書多維表格是一款功能強大的在線數據管理與協作工具。它打破傳統表格局限,將電子表格與數據庫特性融合,支持看板、甘特圖、表單等多種視圖自由切換,可根據項目進度、任務管理等不同場景靈活展示數據。其豐富的字段類型能精準適配各類…