欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用Pytorch實(shí)現(xiàn)簡(jiǎn)單的線性回歸算法

 更新時(shí)間:2020年01月15日 09:43:18   作者:carmanzzz  
今天小編就為大家分享一篇利用Pytorch實(shí)現(xiàn)簡(jiǎn)單的線性回歸算法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

最近聽了張江老師的深度學(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)文章

最新評(píng)論