溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Pytorch如何使用Pytorch擬合多項式

發(fā)布時間:2021-08-10 11:20:01 來源:億速云 閱讀:159 作者:小新 欄目:開發(fā)技術

這篇文章主要介紹Pytorch如何使用Pytorch擬合多項式,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

使用Pytorch來編寫神經(jīng)網(wǎng)絡具有很多優(yōu)勢,比起Tensorflow,我認為Pytorch更加簡單,結構更加清晰。

希望通過實戰(zhàn)幾個Pytorch的例子,讓大家熟悉Pytorch的使用方法,包括數(shù)據(jù)集創(chuàng)建,各種網(wǎng)絡層結構的定義,以及前向傳播與權重更新方式。

比如這里給出

Pytorch如何使用Pytorch擬合多項式    

很顯然,這里我們只需要假定

Pytorch如何使用Pytorch擬合多項式

這里我們只需要設置一個合適尺寸的全連接網(wǎng)絡,根據(jù)不斷迭代,求出最接近的參數(shù)即可。

但是這里需要思考一個問題,使用全連接網(wǎng)絡結構是毫無疑問的,但是我們的輸入與輸出格式是什么樣的呢?

只將一個x作為輸入合理嗎?顯然是不合理的,因為每一個神經(jīng)元其實模擬的是wx+b的計算過程,無法模擬冪運算,所以顯然我們需要將x,x的平方,x的三次方,x的四次方組合成一個向量作為輸入,假設有n個不同的x值,我們就可以將n個組合向量合在一起組成輸入矩陣。

這一步代碼如下:

def make_features(x): 
 x = x.unsqueeze(1) 
 return torch.cat([x ** i for i in range(1,4)] , 1)

我們需要生成一些隨機數(shù)作為網(wǎng)絡輸入:

def get_batch(batch_size=32): 
 random = torch.randn(batch_size) 
 x = make_features(random) 
 '''Compute the actual results''' 
 y = f(x) 
 if torch.cuda.is_available(): 
  return Variable(x).cuda(), Variable(y).cuda() 
 else: 
  return Variable(x), Variable(y)

其中的f(x)定義如下:

w_target = torch.FloatTensor([0.5,3,2.4]).unsqueeze(1) 
b_target = torch.FloatTensor([0.9]) 
 
def f(x): 
 return x.mm(w_target)+b_target[0]

接下來定義模型:

class poly_model(nn.Module): 
 def __init__(self): 
  super(poly_model, self).__init__() 
  self.poly = nn.Linear(3,1) 
 
 def forward(self, x): 
  out = self.poly(x) 
  return out
if torch.cuda.is_available(): 
 model = poly_model().cuda() 
else: 
 model = poly_model()

接下來我們定義損失函數(shù)和優(yōu)化器:

criterion = nn.MSELoss() 
optimizer = optim.SGD(model.parameters(), lr = 1e-3)

網(wǎng)絡部件定義完后,開始訓練:

epoch = 0 
while True: 
 batch_x,batch_y = get_batch() 
 output = model(batch_x) 
 loss = criterion(output,batch_y) 
 print_loss = loss.data[0] 
 optimizer.zero_grad() 
 loss.backward() 
 optimizer.step() 
 epoch+=1 
 if print_loss < 1e-3: 
  break

到此我們的所有代碼就敲完了,接下來我們開始詳細了解一下其中的一些代碼。

在make_features()定義中,torch.cat是將計算出的向量拼接成矩陣。unsqueeze是作一個維度上的變化。

get_batch中,torch.randn是產(chǎn)生指定維度的隨機數(shù),如果你的機器支持GPU加速,可以將Variable放在GPU上進行運算,類似語句含義相通。

x.mm是作矩陣乘法。

模型定義是重中之重,其實當你掌握Pytorch之后,你會發(fā)現(xiàn)模型定義是十分簡單的,各種基本的層結構都已經(jīng)為你封裝好了。所有的層結構和損失函數(shù)都來自torch.nn,所有的模型構建都是從這個基類 nn.Module繼承的。模型定義中,__init__與forward是有模板的,大家可以自己體會。

nn.Linear是做一個線性的運算,參數(shù)的含義代表了輸入層與輸出層的結構,即3*1;在訓練階段,有幾行是Pytorch不同于別的框架的,首先loss是一個Variable,通過loss.data可以取出一個Tensor,再通過data[0]可以得到一個int或者float類型的值,我們才可以進行基本運算或者顯示。每次計算梯度之前,都需要將梯度歸零,否則梯度會疊加。個人覺得別的語句還是比較好懂的,如果有疑問可以在下方評論。

下面是我們的擬合結果

Pytorch如何使用Pytorch擬合多項式

以上是“Pytorch如何使用Pytorch擬合多項式”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI