以前的文章有提到,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量化最前沿技術、資訊。