利用Pytorch實(shí)現(xiàn)簡(jiǎn)單的線性回歸算法
最近聽了張江老師的深度學(xué)習(xí)課程,用Pytorch實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)預(yù)測(cè),之前做Titanic生存率預(yù)測(cè)的時(shí)候稍微了解過Tensorflow,聽說Tensorflow能做的Pyorch都可以做,而且更方便快捷,自己嘗試了一下代碼的邏輯確實(shí)比較簡(jiǎn)單。
Pytorch涉及的基本數(shù)據(jù)類型是tensor(張量)和Autograd(自動(dòng)微分變量),對(duì)于這些概念我也是一知半解,tensor和向量,矩陣等概念都有交叉的部分,下次有時(shí)間好好補(bǔ)一下數(shù)學(xué)的基礎(chǔ)知識(shí),不過現(xiàn)階段的任務(wù)主要是應(yīng)用,學(xué)習(xí)掌握思維和方法即可,就不再深究了。tensor和ndarray可以相互轉(zhuǎn)換,python的numpy庫(kù)中的命令也都基本適用。
一些基本的代碼:
import torch #導(dǎo)入torch包 x = torch.rand(5, 3) #產(chǎn)生一個(gè)5*3的tensor,在 [0,1) 之間隨機(jī)取值 y = torch.ones(5, 3) #產(chǎn)生一個(gè)5*3的Tensor,元素都是1 #和numpy的命令一致 #tensor的運(yùn)算 z = x + y #兩個(gè)tensor可以直接相加 q = x.mm(y.transpose(0, 1)) #x乘以y的轉(zhuǎn)置 mm為矩陣的乘法,矩陣相乘必須某一個(gè)矩陣的行與另一個(gè)矩陣的列相等 ##Tensor與numpy.ndarray之間的轉(zhuǎn)換 import numpy as np #導(dǎo)入numpy包 a = np.ones([5, 3]) #建立一個(gè)5*3全是1的二維數(shù)組(矩陣) b = torch.from_numpy(a) #利用from_numpy將其轉(zhuǎn)換為tensor c = torch.FloatTensor(a) #另外一種轉(zhuǎn)換為tensor的方法,類型為FloatTensor,還可以使LongTensor,整型數(shù)據(jù)類型 b.numpy() #從一個(gè)tensor轉(zhuǎn)化為numpy的多維數(shù)組 from torch.autograd import Variable #導(dǎo)入自動(dòng)梯度的運(yùn)算包,主要用Variable這個(gè)類 x = Variable(torch.ones(2, 2), requires_grad=True) #創(chuàng)建一個(gè)Variable,包裹了一個(gè)2*2張量,將需要計(jì)算梯度屬性置為True
下面用pytorch做一個(gè)簡(jiǎn)單的線性關(guān)系預(yù)測(cè)
線性關(guān)系是一種非常簡(jiǎn)單的變量之間的關(guān)系,因變量和自變量在線性關(guān)系的情況下,可以使用線性回歸算法對(duì)一個(gè)或多個(gè)因變量和自變量間的線性關(guān)系進(jìn)行建模,該模型的系數(shù)可以用最小二乘法進(jìn)行求解。生活中的場(chǎng)景往往會(huì)比較復(fù)雜,需要考慮多元線性關(guān)系和非線性關(guān)系,用其他的回歸分析方法求解。
這里po上代碼:
#人為生成一些樣本點(diǎn)作為原始數(shù)據(jù) x = Variable(torch.linspace(0, 100).type(torch.FloatTensor)) rand = Variable(torch.randn(100)) * 10 #隨機(jī)生成100個(gè)滿足標(biāo)準(zhǔn)正態(tài)分布的隨機(jī)數(shù),均值為0,方差為1.將這個(gè)數(shù)字乘以10,標(biāo)準(zhǔn)方差變?yōu)?0 y = x + rand #將x和rand相加,得到偽造的標(biāo)簽數(shù)據(jù)y。所以(x,y)應(yīng)能近似地落在y=x這條直線上 import matplotlib.pyplot as plt #導(dǎo)入畫圖的程序包 plt.figure(figsize=(10,8)) #設(shè)定繪制窗口大小為10*8 inch plt.plot(x.data.numpy(), y.data.numpy(), 'o') #繪制數(shù)據(jù),考慮到x和y都是Variable,需要用data獲取它們包裹的Tensor,并專成numpy plt.xlabel('X') plt.ylabel('Y') plt.show()
圖示:
訓(xùn)練模型:
#a,b就是要構(gòu)建的線性函數(shù)的系數(shù) a = Variable(torch.rand(1), requires_grad = True) #創(chuàng)建a變量,并隨機(jī)賦值初始化 b = Variable(torch.rand(1), requires_grad = True) #創(chuàng)建b變量,并隨機(jī)賦值初始化 print('Initial parameters:', [a, b]) learning_rate = 0.0001 #設(shè)置學(xué)習(xí)率 for i in range(1000): ### 增加了這部分代碼,清空存儲(chǔ)在變量a,b中的梯度信息,以免在backward的過程中會(huì)反復(fù)不停地累加 if (a.grad is not None) and (b.grad is not None): a.grad.data.zero_() b.grad.data.zero_() predictions = a.expand_as(x) * x+ b.expand_as(x) #計(jì)算在當(dāng)前a、b條件下的模型預(yù)測(cè)數(shù)值 loss = torch.mean((predictions - y) ** 2) #通過與標(biāo)簽數(shù)據(jù)y比較,計(jì)算誤差 print('loss:', loss) loss.backward() #對(duì)損失函數(shù)進(jìn)行梯度反傳,backward的方向傳播算法 a.data.add_(- learning_rate * a.grad.data) #利用上一步計(jì)算中得到的a的梯度信息更新a中的data數(shù)值 b.data.add_(- learning_rate * b.grad.data) #利用上一步計(jì)算中得到的b的梯度信息更新b中的data數(shù)值 ##擬合 x_data = x.data.numpy() plt.figure(figsize = (10, 7)) xplot = plt.plot(x_data, y.data.numpy(), 'o') # 繪制原始數(shù)據(jù) yplot = plt.plot(x_data, a.data.numpy() * x_data + b.data.numpy()) #繪制擬合數(shù)據(jù) plt.xlabel('X') plt.ylabel('Y') str1 = str(a.data.numpy()[0]) + 'x +' + str(b.data.numpy()[0]) #圖例信息 plt.legend([xplot, yplot],['Data', str1]) #繪制圖例 plt.show()
圖示:
測(cè)試:
x_test = Variable(torch.FloatTensor([1, 2, 10, 100, 1000])) #隨便選擇一些點(diǎn)1,2,……,1000 predictions = a.expand_as(x_test) * x_test + b.expand_as(x_test) #計(jì)算模型的預(yù)測(cè)結(jié)果 predictions #輸出
ok,大功告成,可以看到用pytorch做機(jī)器學(xué)習(xí)確實(shí)無論是準(zhǔn)確度還是方便性都有優(yōu)勢(shì),繼續(xù)探索學(xué)習(xí)。
以上這篇利用Pytorch實(shí)現(xiàn)簡(jiǎn)單的線性回歸算法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python裝飾器實(shí)現(xiàn)對(duì)異常代碼出現(xiàn)進(jìn)行自動(dòng)監(jiān)控的實(shí)現(xiàn)方法
這篇文章主要介紹了python裝飾器實(shí)現(xiàn)對(duì)異常代碼出現(xiàn)進(jìn)行自動(dòng)監(jiān)控的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09python基礎(chǔ)教程之lambda表達(dá)式使用方法
lambda表達(dá)式相當(dāng)于函數(shù)體為單個(gè)return語(yǔ)句的普通函數(shù)的匿名函數(shù),本文主要介紹lambda表達(dá)式使用方法2014-02-02ansible動(dòng)態(tài)Inventory主機(jī)清單配置遇到的坑
這篇文章主要介紹了ansible動(dòng)態(tài)Inventory主機(jī)清單配置遇到的坑,需要的朋友可以參考下2020-01-01對(duì)python中字典keys,values,items的使用詳解
今天小編就為大家分享一篇對(duì)python中字典keys,values,items的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-02-02Python實(shí)現(xiàn)動(dòng)態(tài)生成系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)到Word文檔
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)填寫相關(guān)數(shù)據(jù)庫(kù)信息后,生成系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)到word文檔,文中示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-06-06python3.5+tesseract+adb實(shí)現(xiàn)西瓜視頻或頭腦王者輔助答題
這篇文章主要介紹了python3.5+tesseract+adb實(shí)現(xiàn)西瓜視頻或頭腦王者輔助答題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Python實(shí)現(xiàn)抓取頁(yè)面上鏈接的簡(jiǎn)單爬蟲分享
這篇文章主要介紹了Python實(shí)現(xiàn)抓取頁(yè)面上鏈接的簡(jiǎn)單爬蟲分享,本文使用了一個(gè)開源模塊requests實(shí)現(xiàn)需求,需要的朋友可以參考下2015-01-01