Pytorch-tutorials-学习(三)

由于在之前的调参过程中出现了极其低级的错误(缺少optimizer.zero_grad()),因此决定自己更加深入地研究一下pytorch

Pytorch forward pass

1.input——往往是带minibatch的数据(批处理)。要variable处理,因为处理前只是tensor,而处理后是data(tensor)+grad=variable.
2.将input放入网络中,会吐出output.
3.对output或者说loss采用backward()的操作,会得到各个数据的梯度。(千万要注意,在词之前要先zero_grad())

1
2
我们可以通过print(loss.grad_fn来查看构建loss的函数
还可以用print(loss.grad_fn.next_functions[0][0])往loss前面查上一个函数。还可以用print(loss.grad_fn.next_functions[0][0].next_functions[0][0])查loss的上上个函数。

4.有了各个参数的导数后,如何更新??用optimizer.step()更新。因为在定义optimizer的时候已经将其与模型的参数绑定了。

上述过程就是一次正向和反向的过程。
net.zero_grad()效用与optimizer.zero_grad()相同
net.parameters()效用与optimizer.param_groups()相同
但是注意:net与optimizer调取parameters后得到的参数形式不同,

  • 1.net.parameters()得到的是一个generator,因此若要得到各个参数可以用for i in net.parameters():的形式获取得到所有参数
  • 2.optimizer.param_groups是一个list的形式,因此可以用list的方式得到各个参数
  • 如何将net.parameters()这种generator的形式转换为list,强制类型转换list(net.parameters()),一定要注意一定要赋值给某个变量,不能让他单独出现,否则会报错。

optimizer.step如何更新参数
optimizer.param_groups[i].data.add(group[‘lr’],optimizer.param_groups[i].grad) 这里add函数实际上将两个参数先相乘,然后再与前面的相加。这里的lr在之前已经加了负号。

Our Net

我们的模型从nn.Module中得到了什么

  • 定义Net类时,需要class Net(nn.Modeule):让这个类继承nn.Modeule中的所有函数。
  • Net的init先要super(Net,self).init()这是在初始化时继承nn.Module的初始化函数,里面是与C语言连接的各个函数。
  • nn.Module里显然是有init函数和forward函数,这两个会被重写。
  • 在运行完superclass(nn.Module)的init后,就会把module里的所有函数都继承给Net(class).

    nn.Conv2d里面构建了什么

    nn.COnv2d里继承里面的ConvNd,ConvNd又继承了nn.Module
-------------本文结束感谢您的阅读-------------

本文标题:Pytorch-tutorials-学习(三)

文章作者:Yif Du

发布时间:2018年11月18日 - 22:11

最后更新:2018年11月21日 - 00:11

原始链接:http://yifdu.github.io/2018/11/18/Pytorch-tutorials-学习(三)/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。