怎么在Pytorch中拟合函数

  介绍

这篇文章给大家介绍怎么在Pytorch中拟合函数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

<强>一、定义拟合网络

<强> 1,观察普通的神经网络的优化流程

#,定义网络   时间=net …   #,定义优化器   时间=optimizer  torch.optim.Adam (net.parameters (),, lr=0.001,, weight_decay=0.0005)   #,定义损失函数   时间=loss_op  torch.nn.MSELoss(减少=& # 39;和# 39;)   #,优化   一步,for (输入,,标签),拷贝列举(dataset_loader):   ,#向前传播=,outputs 净(输入)   ,#计算损失=,,loss  loss_op(标签,输出)   ,#清空梯度   ,optimizer.zero_grad ()   ,#向后传播   ,loss.backward ()   ,#更新梯度   之前,optimizer.step ()

上面的代码就是一般情况下的流程。为了能使用Pytorch内置的优化器,所以我们需要定义一个一个网络,实现函数参数(返回需要优化的参数)和未来(向前传播);为了能支持GPU优化,还需要实现cuda和cpu两个函数,把参数从内存复制到GPU上和从GPU复制回内存。

基于以上要求,网络的定义就类似于:

class 净:   def 才能__init__(自我):   ,,,#,在这里定义要求的参数   ,才能通过      def 才能;cuda(自我):   ,,,#,传输参数到GPU   ,才能通过      def 才能;cpu(自我):   ,,,#,把参数传输回内存   ,才能通过      def 才能向前(自我,,输入):   ,,#,实现向前传播,就是根据输入输入计算一遍输出   ,才能通过      def 才能;参数(自我):   ,,#,返回参数   ,,,通过

在拟合数据量很大时,还可以使用GPU来加速;如果没有英伟达显卡,则可以不实现cuda和cpu这两个函数。

<强> 2,初始化网络

回顾本文目的,拟合:y=ax + b,所以在__init__函数中就需要定义a和b两个参数,另外为了实现参数,cpu和cuda,还需要定义属性__parameters和__gpu:

,, def  __init__(自我):   ,,,#,y =, * x  + b   ,,,self.a =, torch.rand (1, requires_grad=True), #,参数   ,,,self.b =, torch.rand (1, requires_grad=True), #,参数b   ,,,self.__parameters =, dict (=self.a,, b=self.b), #,参数字典   ,,,self.___gpu =, False  #,是否使用gpu来拟合

要拟合的参数,不能初始化为0 !,一般使用随机值即可。还需要把requires_grad参数设置为真,这是为了支持向后传播。

<强> 3,实现向前传播

,, def 向前(自我,,输入):   ,,,return  self.a  *, inputs  +自我。b

非常的简单,就是根据输入输入计算一遍输出,在本例中,就是计算一下y=ax + b。计算完了要记得返回计算的结果。

<强> 4,把参数传送到GPU

为了支持GPU来加速拟合,需要把参数传输到GPU,且需要更新参数字典__parameters:

,, def  cuda(自我):   ,,,if  not  self.___gpu:   ,,,,,self.a =, self.a.cuda () .detach () .requires_grad_(真实),#,把一个传输到gpu   ,,,,,self.b =, self.b.cuda () .detach () .requires_grad_(真实),#,把b传输到gpu   ,,,,,self.__parameters =, dict (=self.a,, b=self.b), #,更新参数   ,,,,,self.___gpu =, True  #,更新标志,表示参数已经传输到gpu了   ,,,#,返回自我,以支持链式调用   ,,,return 自我

参数a和b,都是先调用分离再调用requires_grad_,是为了避免错误提高ValueError(“停下来# 39;t优化非叶Tensor")(参考:ValueError:停下来# 39;t优化非叶张量?).

<强> 4,把参数传输回内存

类似于cuda函数,不做过多解释。

,, def  cpu(自我):   ,,,if  self.___gpu:   ,,,,,self.a =, self.a.cpu () .detach () .requires_grad_(真正的)   ,,,,,self.b =, self.b.cpu () .detach () .requires_grad_(真正的)   ,,,,,self.__parameters =, dict (=self.a,, b=self.b)   ,,,,,self.___gpu =False   ,,,return 自我

<强> 5,返回网络参数

为了能使用Pytorch内置的优化器,就要实现参数函数,观察Pytorch里面的实现:

,, def 参数(自我,,递归=True):   ,,,r"““……   ,,,,,,   ,,,for 名字,,param 拷贝self.named_parameters(递归=递归):   ,,,,,油品收率参数

实际上就是使用收益率返回网络的所有参数,因此本例中的实现如下:

,, def 参数(自我):   ,,,for 名字,,param 拷贝self.__parameters.items ():   ,,,,,油品收率参数

怎么在Pytorch中拟合函数