pytorch從入門到精通系列之線性迴歸

以前的文章有提到,pytorch的入門讓人無比愉悅的。但畢竟是深度學習,我說的門檻是和tensorflow比,自己深度學習對於微積分,線性代數和機率論仍是有必定要求的。固然,仍是那句話,其實深度學習涉及的數學原理,比什麼SVM,CRF要簡單太多,並且深度學習的變化和應用場景比前者要多得多,因此學習深度學習是頗有意義的。python

不少官方或非官方的demo,都是長篇大論,由於要演示一個例子,須要準備數據,其實大部分的代碼是在準備數據,預處理,與深度學習自己沒有太大關係。這樣看起來不直觀,把初學者都給嚇住了。因此,打算寫一個入門系列,就是手動造一些簡單的數據,就是爲了演示用。網絡

 

本文要實現線性函數的擬合,就是好比y = 2*x+3這樣的線性函數。首先標準的步驟,導入torch和Variable。函數

import torch
from torch.autograd import Variable

而後準備簡單的數據,x=1,2,3, y = 2,4,6, 線性關係就是y=2*x。注意這裏的tensor是3行一列,而後轉爲Variable。學習

x_data = Variable(torch.Tensor([[1.0],[2.0],[3.0]]))
y_data = Variable(torch.Tensor([[2.0],[4.0],[6.0]]))

而後就能夠定義網絡了,全部的模型都須要繼承自nn.Module。而後定義一個線性層,參數爲1,1。實現forward函數,用做訓練迭代。測試

import torch.nn as nn
class Model(nn.Module):
    def __init__(self):
        super(Model,self).__init__()
        self.linear = nn.Linear(1,1)

    def forward(self,x):
        y_pred = self.linear(x)
        return y_pred

直接實例化模型,並定義損失函數,這裏按咱們高數裏學的,使用最小二乘法。而後使用隨機梯度降低對全部可優化參數進行優化,lr是learning_rate學習速率,也就是梯度變化步長。優化

model = Model()
criterion = nn.MSELoss(size_average=False)
params = model.parameters()
optimizer = torch.optim.SGD(params=params,lr=0.01)

開發循環迭代500次,用x_data經過model獲得y_pred,也是一個3x1的矩陣。而後經過criterion求loss值。人工智能

for epoch in range(500):
    y_pred = model(x_data)#3x1
    loss = criterion(y_pred,y_data)
    #這裏能夠把loss打印出來看,值都是同樣的,由於咱們沒有優化參數。使用data[0]是由於loss.data是一個list
    print(epoch,loss.data[0])

    #而後是三步標準的,導數歸0,反向求導,反向傳播  
optimizer.zero_grad()    
    loss.backward()
    optimizer.step()
這裏值得注意就是每一個epoch,梯度都要歸零。
print('訓練完成!')
x_test = Variable(torch.Tensor([[4.0]]))
y_test = model(x_test)
#y_test是一個Variable,包括.data是一個FloatTensor,size=1x1
print('x_test:%d,預測值爲%f'%(x_test.data[0][0],y_test.data[0][0]))

最後使用訓練好的模型去測試,看下結果:繼承

訓練完成!開發

x_test:4,預測值爲7.975748深度學習

 

關於做者:魏佳斌,互聯網產品/技術總監,北京大學光華管理學院(MBA),特許金融分析師(CFA),資深產品經理/碼農。偏心python,深度關注互聯網趨勢,人工智能,AI金融量化。致力於使用最前沿的認知技術去理解這個複雜的世界。

掃描下方二維碼,關注:AI量化實驗室(ailabx),瞭解AI量化最前沿技術、資訊。

相關文章
相關標籤/搜索