使用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()