由于在之前的调参过程中出现了极其低级的错误(缺少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在之前已经加了负号。