这篇文章给大家介绍怎么在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中拟合函数