日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

【深度学习】PyTorch 中的线性回归和梯度下降

發(fā)布時(shí)間:2025/3/12 pytorch 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【深度学习】PyTorch 中的线性回归和梯度下降 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者 | JNK789? ?編譯 | Flin??來源 | analyticsvidhya

我們正在使用 Jupyter notebook 來運(yùn)行我們的代碼。我們建議在Google Colaboratory上遵循本教程。你可以查看此鏈接以獲取有關(guān)其用法的更多信息。

  • https://www.analyticsvidhya.com/blog/2020/03/google-colab-machine-learning-deep-learning/

為了完成本教程,假設(shè)你已具備 PyTorch 和 Python 編程的先驗(yàn)知識。不需要機(jī)器學(xué)習(xí)的先決知識。你可以查看我們之前關(guān)于 PyTorch 的博客以熟悉它。

  • https://www.analyticsvidhya.com/blog/2021/04/a-gentle-introduction-to-pytorch-library/

線性回歸簡介

反向傳播是深度學(xué)習(xí)中一種強(qiáng)大的技術(shù),用于更新權(quán)重和偏差,從而使模型能夠?qū)W習(xí)。為了更好地說明反向傳播,讓我們看一下線性回歸模型在 PyTorch 中的實(shí)現(xiàn)

線性回歸是機(jī)器學(xué)習(xí)中的基本算法之一。線性回歸在輸入特征 (X) 和輸出標(biāo)簽 (y) 之間建立線性關(guān)系。

在線性回歸中,每個(gè)輸出標(biāo)簽都表示為使用權(quán)重和偏差的輸入特征的線性函數(shù)。這些權(quán)重和偏差是隨機(jī)初始化的模型參數(shù),然后通過數(shù)據(jù)集的每個(gè)訓(xùn)練/學(xué)習(xí)周期進(jìn)行更新。在經(jīng)過一次訓(xùn)練數(shù)據(jù)迭代后訓(xùn)練模型和更新參數(shù)被稱為一個(gè)時(shí)期。

所以現(xiàn)在我們應(yīng)該訓(xùn)練模型幾個(gè)時(shí)期,以便權(quán)重和偏差可以學(xué)習(xí)輸入特征和輸出標(biāo)簽之間的線性關(guān)系。

因此,在本教程中,讓我們創(chuàng)建一個(gè)假設(shè)數(shù)據(jù)模型,該模型由芒果和橙子的作物產(chǎn)量組成,并給出了特定地點(diǎn)的平均溫度、年降雨量和濕度。訓(xùn)練數(shù)據(jù)如下:

地區(qū)溫度(華氏度)降雨量(毫米)濕度 (%)芒果(噸)橙子(噸)
A7367435670
B91886481101
C8713458119133
D10243372237
E699670103119
F7466435769
G91876580102
H8813459118132
I10144372138
J689671104118
7366445769
92876482100
8713557118134
N10343362038
689770102120

在線性回歸中,每個(gè)目標(biāo)標(biāo)簽都表示為輸入變量的加權(quán)總和以及偏差,即

芒果 = w11 * 溫度 + w 12 * 降雨量 + w 13 * 濕度 + b 1

橙子 = w 21 * 溫度 + w 22 * 降雨量 + w 23 * 濕度 + b 2

最初,權(quán)重和偏差是隨機(jī)初始化的,然后在訓(xùn)練過程中進(jìn)行相應(yīng)的更新,以便這些權(quán)重和偏差能夠預(yù)測任何地區(qū)的芒果和橙子產(chǎn)量,前提是溫度、降雨量和濕度達(dá)到一定的準(zhǔn)確度。

簡而言之,這就是機(jī)器學(xué)習(xí)。

所以現(xiàn)在讓我們開始使用 Pytorch 實(shí)現(xiàn)

進(jìn)口

導(dǎo)入所需的庫

import?torch import?numpy?as?np

加載數(shù)據(jù)

上表中給出的訓(xùn)練數(shù)據(jù)可以使用 NumPy 表示為矩陣。所以讓我們分別定義輸入和目標(biāo),

inputs?=?np.array([[73,?67,?43],?[91,?88,?64],?[87,?134,?58],?[102,?43,?37],?[69,?96,?70],?[74,?66,?43],?[91,?87,?65],?[88,?134,?59],?[101,?44,?37],?[68,?96,?71],?[73,?66,?44],?[92,?87,?64],?[87,?135,?57],?[103,?43,?36],?[68,?97,?70]],?dtype='float32') targets?=?np.array([[56,?70],?[81,?101],?[119,?133],?[22,?37],?[103,?119],[57,?69],?[80,?102],?[118,?132],?[21,?38],?[104,?118],?[57,?69],?[82,?100],?[118,?134],?[20,?38],?[102,?120]],?dtype='float32')

輸入矩陣和目標(biāo)矩陣都作為 NumPy 數(shù)組加載。

這應(yīng)該使用torch.from_numpy()方法轉(zhuǎn)換為torch張量 ,

inputs?=?torch.from_numpy(inputs) targets?=?torch.from_numpy(targets)

我們可以檢查兩個(gè)張量,

print(inputs)

輸出:

![](http://qiniu.aihubs.net/66457Screenshot 2021-08-27 at 6.27.31 PM.png)

print(targets)

輸出:

![](http://qiniu.aihubs.net/15827Screenshot 2021-08-27 at 6.27.37 PM.png)

現(xiàn)在讓我們創(chuàng)建一個(gè)TensorDataset,它將輸入和目標(biāo)張量包裝到一個(gè)數(shù)據(jù)集中。讓我們從torch.utils.data導(dǎo)入TensorDataset方法。

我們可以以元組的形式訪問數(shù)據(jù)集中的行。

from?torch.utils.data?import?TensorDataset dataset?=?TensorDataset(inputs,?targets)

我們可以使用 Python 中的索引從定義的數(shù)據(jù)集中訪問輸入行和相應(yīng)的目標(biāo)。

dataset[:3]

![](http://qiniu.aihubs.net/23399Screenshot 2021-08-27 at 6.29.29 PM.png)

現(xiàn)在讓我們將數(shù)據(jù)集轉(zhuǎn)換為數(shù)據(jù)加載器,它可以在訓(xùn)練期間將數(shù)據(jù)拆分為預(yù)定義批量大小的批次。

使用 Pytorch 的DataLoader類,我們可以將數(shù)據(jù)集轉(zhuǎn)換為預(yù)定義批量大小的批次,并通過從數(shù)據(jù)集中隨機(jī)挑選樣本來創(chuàng)建批次。

from?torch.utils.data?import?DataLoaderbatch_size?=?3 train_loader?=?DataLoader(dataset,?batch_size=batch_size,?shuffle=True)

我們可以使用 for 循環(huán)將DataLoader 中的數(shù)據(jù)作為包含輸入和相應(yīng)目標(biāo)的元組對訪問,這使我們能夠?qū)⑴沃苯蛹虞d到訓(xùn)練循環(huán)中。

#?A?Batch?Sample for?inp,target?in?train_loader:print(inp)print(target)break

輸出:

![](http://qiniu.aihubs.net/78715Screenshot 2021-08-27 at 6.30.36 PM.png)

現(xiàn)在我們的數(shù)據(jù)已準(zhǔn)備好進(jìn)行訓(xùn)練,讓我們定義線性回歸算法。

線性回歸——從頭開始

在統(tǒng)計(jì)建模中,回歸分析是一組統(tǒng)計(jì)過程,用于估計(jì)因變量與一個(gè)或多個(gè)自變量之間的關(guān)系。-維基百科

讓我們從頭開始實(shí)現(xiàn)一個(gè)線性回歸模型。我們應(yīng)該找到上述方程中指定的最佳權(quán)重和偏差,以便它定義輸入和輸出之間的理想線性關(guān)系。

因此,我們定義了一組權(quán)重,如上述等式,以建立與輸入特征和目標(biāo)的線性關(guān)系。在這里,我們還將超參數(shù)(即權(quán)重和偏差)的requires_grad屬性設(shè)置 為True。

w?=?torch.randn(2,?3,?requires_grad=True) b?=?torch.randn(2,?requires_grad=True) print(w) print(b)

輸出:

![](http://qiniu.aihubs.net/14038Screenshot 2021-08-27 at 6.31.29 PM.png)

torch.randn從均值 0 和標(biāo)準(zhǔn)差 1 的均勻分布中隨機(jī)生成張量。

線性回歸方程為 y = w * X + b,其中

  • y是輸出或因變量

  • X是輸入或自變量

  • w & b分別是權(quán)重和偏差

因此,現(xiàn)在讓我們定義我們的線性回歸模型,

def?model(X):return?X?@?w.t()?+?b

該模型只是一個(gè)建立權(quán)重和輸出之間線性關(guān)系的數(shù)學(xué)方程。

使用輸入批次和權(quán)重的轉(zhuǎn)置執(zhí)行矩陣乘法(@ 表示矩陣乘法)。

現(xiàn)在讓我們?yōu)橐慌鷶?shù)據(jù)預(yù)測模型的輸出,

for?x,y?in?train_loader:preds?=?model(x)print("Prediction?is?:n",preds)print("nActual?targets?is?:n",y)break

輸出:

![](http://qiniu.aihubs.net/78324Screenshot 2021-08-27 at 6.38.41 PM.png)

我們可以在上面看到我們的模型預(yù)測的值與實(shí)際目標(biāo)相差很大,因?yàn)槲覀兊哪P褪怯秒S機(jī)權(quán)重和偏差初始化的。

顯然,我們不能指望我們隨機(jī)初始化的模型表現(xiàn)良好。

損失函數(shù)

損失函數(shù)是衡量模型表現(xiàn)如何的指標(biāo)。損失函數(shù)在更新超參數(shù)方面起著重要作用,因此產(chǎn)生的損失會更少。

回歸最廣泛使用的損失函數(shù)之一是均方誤差L2 損失。

MSE 定義了實(shí)際值和預(yù)測值之間差異的平方平均值。MSE如下:

def?mse_loss(predictions,?targets):difference?=?predictions?-?targetsreturn?torch.sum(difference?*?difference)/?difference.numel()

.numel()方法返回張量中的元素?cái)?shù)。

現(xiàn)在讓我們進(jìn)行預(yù)測并計(jì)算未經(jīng)訓(xùn)練的模型的損失,

for?x,y?in?train_loader:preds?=?model(x)print("Prediction?is?:n",preds)print("nActual?targets?is?:n",y)print("nLoss?is:?",mse_loss(preds,?y))break

輸出:

![](http://qiniu.aihubs.net/52814Screenshot 2021-08-27 at 6.39.46 PM.png)

我們可以看到我們的預(yù)測與實(shí)際目標(biāo)相差很大,這表明模型的損失很大。

因此,我們應(yīng)該更新權(quán)重和偏差,以減少損失。這可以通過使用稱為梯度下降的優(yōu)化算法來完成。

梯度下降

梯度下降是一種一階迭代優(yōu)化算法,用于尋找可微函數(shù)的局部最小值。這個(gè)想法是在當(dāng)前點(diǎn)的函數(shù)梯度(或近似梯度)的相反方向上重復(fù)步驟,因?yàn)檫@是最陡下降的方向。– 維基百科

梯度下降是一種優(yōu)化算法,它計(jì)算損失函數(shù)的導(dǎo)數(shù)/梯度以更新權(quán)重并相應(yīng)地減少損失或找到損失函數(shù)的最小值。

在 PyTorch 中實(shí)現(xiàn)梯度下降的步驟,

  • 首先,計(jì)算損失函數(shù)

  • 求關(guān)于自變量的損失梯度

  • 更新權(quán)重和 bais

  • 重復(fù)以上步驟

現(xiàn)在讓我們開始編碼并實(shí)現(xiàn) 50 個(gè) 時(shí)期的梯度下降,

epochs?=?50 for?i?in?range(epochs):#?Iterate?through?training?dataloaderfor?x,y?in?train_loader:#?Generate?Predictionpreds?=?model(x)#?Get?the?loss?and?perform?backpropagationloss?=?mse_loss(preds,?y)loss.backward()#?Let's?update?the?weightswith?torch.no_grad():w?-=?w.grad?*1e-6b?-=?b.grad?*?1e-6#?Set?the?gradients?to?zerow.grad.zero_()b.grad.zero_()print(f"Epoch?{i}/{epochs}:?Loss:?{loss}")

輸出:

![](http://qiniu.aihubs.net/38235Screenshot 2021-08-27 at 6.40.41 PM.png)

現(xiàn)在我們可以看到我們從頭開始定制的線性回歸模型正在訓(xùn)練給定的數(shù)據(jù)。

我們可以看到損失一直在逐漸減少。現(xiàn)在讓我們檢查一下輸出,

for?x,y?in?train_loader:preds?=?model(x)print("Prediction?is?:n",preds)print("nActual?targets?is?:n",y)break

輸出:

我們可以看到預(yù)測幾乎接近實(shí)際目標(biāo)。我們能夠通過訓(xùn)練/更新線性回歸模型的權(quán)重和偏差來預(yù)測 50 個(gè)時(shí)期。

結(jié)論

這種在數(shù)據(jù)集每次迭代后通過我們基于損失的模型使用梯度下降更新權(quán)重/參數(shù)的過程定義了深度學(xué)習(xí)的基礎(chǔ)它可以解決包括視覺、圖像、文本等在內(nèi)的大量任務(wù)

往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載(圖文+視頻)機(jī)器學(xué)習(xí)入門系列下載中國大學(xué)慕課《機(jī)器學(xué)習(xí)》(黃海廣主講)機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)交流qq群955171419,加入微信群請掃碼:

總結(jié)

以上是生活随笔為你收集整理的【深度学习】PyTorch 中的线性回归和梯度下降的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。