我是做金融領域量化交易的。本來一直使用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()

