pytorch使用Variable實現線性迴歸

這篇文章主要爲大家詳細介紹了pytorch使用Variable實現線性迴歸,具有一定的參考價值,感興趣的小夥伴們可以參考一下

本文實例爲大家分享了pytorch使用Variable實現線性迴歸的具體代碼,供大家參考,具體內容如下

一、手動計算梯度實現線性迴歸

#導入相關包
import torch as t
import matplotlib.pyplot as plt
 
#構造數據
def get_fake_data(batch_size = 8):
 #設置隨機種子數,這樣每次生成的隨機數都是一樣的
 t.manual_seed(10)
 #產生隨機數據:y = 2*x+3,加上了一些噪聲
 x = t.rand(batch_size,1) * 20
 #randn生成期望爲0方差爲1的正態分佈隨機數
 y = x * 2 + (1 + t.randn(batch_size,1)) * 3 
 return x,y
 
#查看生成數據的分佈
x,y = get_fake_data()
plt.scatter(x.squeeze().numpy(),y.squeeze().numpy())
 
#線性迴歸
 
#隨機初始化參數
w = t.rand(1,1)
b = t.zeros(1,1)
#學習率
lr = 0.001 
 
for i in range(10000):
 x,y = get_fake_data()
 
 #forward:計算loss
 y_pred = x.mm(w) + b.expand_as(y)
 
 #均方誤差作爲損失函數
 loss = 0.5 * (y_pred - y)**2 
 loss = loss.sum()
 
 #backward:手動計算梯度
 dloss = 1
 dy_pred = dloss * (y_pred - y)
 dw = x.t().mm(dy_pred)
 db = dy_pred.sum()
 
 #更新參數
 w.sub_(lr * dw)
 b.sub_(lr * db)
 
 if i%1000 == 0:
 #畫圖
 plt.scatter(x.squeeze().numpy(),y.squeeze().numpy())
 
 x1 = t.arange(0,20).float().view(-1,1)
 y1 = x1.mm(w) + b.expand_as(x1)
 plt.plot(x1.numpy(),y1.numpy()) #predicted
 plt.show()
 #plt.pause(0.5)
 print(w.squeeze(),b.squeeze())

顯示的最後一張圖如下所示:

二、自動梯度 計算梯度實現線性迴歸

#導入相關包
import torch as t
from torch.autograd import Variable as V
import matplotlib.pyplot as plt
 
#構造數據
def get_fake_data(batch_size=8):
 t.manual_seed(10) #設置隨機數種子
 x = t.rand(batch_size,1) * 20
 y = 2 * x +(1 + t.randn(batch_size,1)) * 3
 return x,y
 
#查看產生的x,y的分佈是什麼樣的
x,y = get_fake_data()
plt.scatter(x.squeeze().numpy(),y.squeeze().numpy())
 
#線性迴歸
 
#初始化隨機參數
w = V(t.rand(1,1),requires_grad=True)
b = V(t.rand(1,1),requires_grad=True)
lr = 0.001
for i in range(8000):
 x,y = get_fake_data()
 x,y = V(x),V(y)
 y_pred = x * w + b
 loss = 0.5 * (y_pred-y)**2
 loss = loss.sum()
 
 #自動計算梯度
 loss.backward()
 #更新參數
 w.data.sub_(lr * w.grad.data)
 b.data.sub_(lr * b.grad.data)
 
 #梯度清零,不清零梯度會累加的
 w.grad.data.zero_()
 b.grad.data.zero_()
 
 if i%1000==0:
 #predicted
 x = t.arange(0,20).float().view(-1,1)
 y = x.mm(w.data) + b.data.expand_as(x)
 plt.plot(x.numpy(),y.numpy())
 
 #true data
 x2,y2 = get_fake_data()
 plt.scatter(x2.numpy(),y2.numpy())
 plt.show()
print(w.data[0],b.data[0])

顯示的最後一張圖如下所示:

用autograd實現的線性迴歸最大的不同點就在於利用autograd不需要手動計算梯度,可以自動微分。這一點不單是在深度在學習中,在許多機器學習的問題中都很有用。另外,需要注意的是每次反向傳播之前要記得先把梯度清零,因爲autograd求得的梯度是自動累加的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持神馬文庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章