设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 运营中心 > 建站资源 > 经验 > 正文

PyTorch的4分钟教程,手把手教你完成线性回归(2)

发布时间:2019-07-29 00:20 所属栏目:19 来源:大数据文摘
导读:以下是PyTorch变量用法的简单示例,将v1和v2相乘的结果赋值给v3,其中里面的参数requires_grad的属性默认为False,若一个节点requires_grad被设置为True,那么所有依赖它的节点的requires_grad都为True,主要用于梯

以下是PyTorch变量用法的简单示例,将v1和v2相乘的结果赋值给v3,其中里面的参数requires_grad的属性默认为False,若一个节点requires_grad被设置为True,那么所有依赖它的节点的requires_grad都为True,主要用于梯度的计算。

  1. #Variable(part of autograd package) 
  2. #Variable (graph nodes) are thin wrappers around tensors and have dependency knowle 
  3. #Variable enable backpropagation of gradients and automatic differentiations 
  4. #Variable are set a 'volatile' flad during infrencing 
  5.  
  6.  
  7. from torch.autograd import Variable 
  8. v1 = Variable(torch.tensor([1.,2.,3.]), requires_grad=False) 
  9. v2 = Variable(torch.tensor([4.,5.,6.]), requires_grad=True) 
  10. v3 = v1*v2 
  11.  
  12.  
  13. v3.data.numpy() 

运行结果:

PyTorch的4分钟教程,手把手教你完成线性回归

  1. #Variables remember what created them 
  2. v3.grad_fn 

运行结果:

PyTorch的4分钟教程,手把手教你完成线性回归

Back Propagation

反向传播算法用于计算相对于输入权重和偏差的损失梯度,以在下一次优化迭代中更新权重并最终减少损失,PyTorch在分层定义对于变量的反向方法以执行反向传播方面非常智能。

以下是一个简单的反向传播计算方法,以sin(x)为例计算差分:

  1. #Backpropagation with example of sin(x) 
  2. x=Variable(torch.Tensor(np.array([0.,1.,1.5,2.])*np.pi),requires_grad=True) 
  3. y=torch.sin(x) 
  4. x.grad 
  5. y.backward(torch.Tensor([1.,1.,1.,1])) 
  6.  
  7.  
  8. #Check gradient is indeed cox(x) 
  9. if( (x.grad.data.int().numpy()==torch.cos(x).data.int().numpy()).all() ): 
  10.     print ("d(sin(x)/dx=cos(x))") 

运行结果:

PyTorch的4分钟教程,手把手教你完成线性回归

对于pytorch中的变量和梯度计算可参考下面这篇文章:

https://zhuanlan.zhihu.com/p/29904755

SLR: Simple Linear Regression

现在我们了解了基础知识,可以开始运用PyTorch 解决简单的机器学习问题——简单线性回归。我们将通过4个简单步骤完成:

第一步:

在步骤1中,我们创建一个由方程y = wx + b产生的人工数据集,并注入随机误差。请参阅以下示例:

  1. #Simple Liner Regression 
  2. # Fit a line to the data. Y =w.x+b 
  3. #Deterministic behavior 
  4. np.random.seed(0) 
  5. torch.manual_seed(0) 
  6. #Step 1:Dataset 
  7. w=2;b=3 
  8. x=np.linspace(0,10,100) 
  9. y=w*x+b+np.random.randn(100)*2 
  10. xx=x.reshape(-1,1) 
  11. yy=y.reshape(-1,1) 

第二步:

在第2步中,我们使用forward函数定义一个简单的类LinearRegressionModel,使用torch.nn.Linear定义构造函数以对输入数据进行线性转换:

  1. #Step 2:Model 
  2. class LinearRegressionModel(torch.nn.Module): 
  3.      
  4.     def __init__(self,in_dimn,out_dimn): 
  5.         super(LinearRegressionModel,self).__init__() 
  6.         self.model=torch.nn.Linear(in_dimn,out_dimn) 
  7.          
  8.     def forward(self,x): 
  9.         y_pred=self.model(x); 
  10.         return y_pred; 
  11.      
  12. model=LinearRegressionModel(in_dimn=1, out_dimn=1) 

torch.nn.Linear参考网站:

https://pytorch.org/docs/stable/_modules/torch/nn/modules/linear.html

第三步:

下一步:使用 MSELoss 作为代价函数,SGD作为优化器来训练模型。

  1. #Step 3: Training 
  2. cost=torch.nn.MSELoss() 
  3. optimizer=torch.optim.SGD(model.parameters(),lr=0.01,momentum=0.9) 
  4. inputs=Variable(torch.from_numpy(x.astype("float32"))) 
  5. outputs=Variable(torch.from_numpy(y.astype("float32"))) 
  6.  
  7.  
  8. for epoch in range(100): 
  9. #3.1 forward pass: 
  10.     y_pred=model(inputs) 
  11.      
  12. #3.2 compute loss 
  13.     loss=cost(y_pred,outputs) 
  14.      
  15. #3.3 backward pass 
  16.     optimizer.zero_grad(); 
  17.     loss.backward() 
  18.     optimizer.step() 
  19.     if((epoch+1)%10==0): 
  20.         print("epoch{},loss{}".format(epoch+1,loss.data)) 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读