总说
记录一下一些小知识, 方便查用.(不断更新中)
- 自定义RNN的写法: Implementation of Multiplicative LSTM
- 自定义二阶梯度写法: How to implement customized layer with second order derivatives
How to customize the double backward - Feeding a Custom Gradient into LSTMs
- retain_graph的讨论
- 定义需要更新的参数 ------ 2019.3.13
定义需要更新的参数注意事项
简单来说, 我们需要更新的参数一般放在__init__
函数中, 如果是可以用现有的层, 比如Conv2d
, Linear
之类的, 就直接用就行了. 因为这些层都是 Module
类, 里面定义了 weights, bias
等, 这些都是定一层Parameter
类型, 当然默认是requires_grad=True
, 值得注意的是, 只有Parameter
类型, 才会被 optimizer
拿到. 这是因为, 一个我们定义的网络是继承自nn.Module()
类.
optimizer
一般情况下, 我们用 Module
类中的model.parameters()
可以得到网络中所有注册为Parameter()
类的参数. 同时model.zero_grad()
可以把所有为Parameter()
类的参数进行梯度清零.
那么, 我们更新参数一般是:
with torch.no_grad():
# 最简单的梯度下降
for p in model.parameters(): p -= p.grad * lr
model.zero_grad()
为了更加简化参数更新方式, pytorch提供optimizer
类, 从而简化操作
my_optimizer.step()
my_optimizer.zero_grad()
optimizer.py中 zero_grad的定义, 我们可以看见, 是把放入optimizer中的所有参数进行置0.
def zero_grad(self<