使用pytorch實現線性擬合,清爽


      我是做金融領域量化交易的。本來一直使用tensorflow研究和工作,但是遇到很多理解上的誤區,耽誤了很多時間。后來研究了一陣子pytorch,確實如網上所說,有后來居上的勢頭,而且在使用中發現更適合研究,快速建模。隨着1.1版本中tensorboard的發布,可視化訓練過程也就沒什么短板了。不過說實話,一般的訓練可視化用matplotlib也足夠了。

所謂的深度學習,核心就是反向傳導機制,求所有參與訓練參數的偏導數,不停的使用一部分偏導數修正參加訓練的參數。

還有句話要記住,深度學習本身是實驗科學,訓練的過程就是用這些數據自動的試錯,識別出有規律的結果,所以對數據量要求很大。

下面從原理講一個pytorch例子的簡單例子,最簡單的線性擬合,沒那么多雲山霧繞的東西,比較清爽。好了,不說那么多了,直接上代碼,注釋很清楚,你看懂了,就說明你徹底理解了所謂深度學習的那些事。

 

 1 class Cmytorch(object):
 2     def __init__(self):
 3         super(Cmytorch,self).__init__() 
 4 
 5     def fun_test1(self):
 6         ##注意並未使用任何框架,純手工打造,講了pytorch線性擬合實現的原理
 7         ##演示torch一元線性擬合算法x * w + b
 8         
 9         import torch
10         import numpy as np
11         import matplotlib.pyplot as plt
12         plt.rcParams['font.sans-serif']=['FangSong'] ##用來正常顯示中文標簽
13         plt.rcParams['axes.unicode_minus']=False##用來正常顯示負號
14         torch.manual_seed(2019)
15 
16         ##准備要擬合的數據並將numpy數據轉為pytorch類型數據
17         x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],
18                             [9.779], [6.182], [7.59], [2.167], [7.042],
19                             [10.791], [5.313], [7.997], [3.1]], dtype=np.float32)
20         
21         y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573],
22                             [3.366], [2.596], [2.53], [1.221], [2.827],
23                             [3.465], [1.65], [2.904], [1.3]], dtype=np.float32)
24         x_train = torch.from_numpy(x_train)
25         y_train = torch.from_numpy(y_train)
26 
27         ##定義參數 w 和 b,目的就是找出最合適的w和b來完成線性擬合
28         ##構建線性擬合模型x * w + b
29         w = torch.randn(1, requires_grad=True) ##參與反向傳導,也就是要參與訓練
30         b = torch.zeros(1, requires_grad=True) ##參與反向傳導,也就是要參與訓練 
31         def linear_model(x):
32             return torch.mul(x, w) + b
33 
34         ##定義loss的計算方式,這里使用均方誤差
35         def get_loss(my_pred, my_y_train):
36             return torch.mean((my_pred - my_y_train) ** 2)
37         
38         ##訓練
39         for e in range(100):
40             pred = linear_model(x_train)##計算pred值
41             loss = get_loss(pred, y_train)##計算loss值
42             ##每一次都重新清空w,b的grad
43             if w.grad:    
44                 w.grad.zero_()
45             if b.grad:    
46                 b.grad.zero_()
47             ##反向計算所有梯度,也就是讓loss極小的所有訓練參數梯度   
48             loss.backward()
49             
50             ##注意:lr這就是學習率的概念
51             ##這里定大定小是比較關鍵的
52             lr = 1e-2
53             ##更新訓練參數,這里使用計算出的梯度(偏導數)不斷更新w,b的data部分
54             ##理解為每次使用梯度的百分之一來更新訓練參數
55             w.data = w.data - lr * w.grad.data
56             b.data = b.data - lr * b.grad.data 
57             print('epoch:{}, loss:{}, w:{}, b:{}'.format(e, loss.item(), w.item(), b.item()))
58         
59         ##訓練完預測並畫出效果
60         y_ = linear_model(x_train)
61         plt.plot(x_train.data.numpy(), y_train.data.numpy(), 'bo', label='原始數據')
62         plt.plot(x_train.data.numpy(), y_.data.numpy(), 'ro', label='擬合數據')
63         plt.legend()       
64         plt.show()
65         
66         return  
67         
68         
69 if __name__ == "__main__" :
70     ct = Cmytorch()
71     ct.fun_test1() 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM