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

 

posted @ 2019-08-06 20:04  凤凰城堡  阅读(2117)  评论(0编辑  收藏  举报