对着敲代码时常会遇到零星问题,本篇博客意在记录实现过程中琐碎知识点,边学边记~
目录
1. 线性回归部分
1.1 数据类型问题
报错: Expected object of scalar type Double but got scalar type Float for argument #2 ‘mat2’
异常代码行:
def linreg(X, w, b):
return torch.mm(X, w) + b
解决:
- float32 对应 torch.FloatTensor;float64 对应 torch.DoubleTensor ,在初始定义数据时,要注意数据类型的统一
features = torch.randn(num_examples, num_inputs,dtype=torch.float32)
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()),dtype=torch.float32)
补充:
- 使用小工具自动查看tensor信息,在执行的时候,自动 print 出来每一行的执行结果的 tensor 的形状、数据类型、设备、是否需要梯度的信息。
- 第一步 pip install torchsnooper
- 第二步 @torchsnooper.snoop() 装饰下要调试的函数即可
@torchsnooper.snoop()
def linreg(X, w, b):
return torch.mm(X, w) + b
1.2 optimizer.step()
Pytorch optimizer.step() 和loss.backward()和scheduler.step()的关系与区别 (Pytorch 代码讲解)
优化器工作需要两个东西
optimizer = optim.SGD(net.parameters(), lr=0.03)
- 当前网络/其他模型的参数空间,于是上图中传入
net.parameters()
- 反向传播的梯度信息,下方为SGD代码,step函数使用的是参数空间中的grad(即当前参数空间梯度)
def step(self, closure=None):
"""Performs a single optimization step.
Arguments:
closure (callable, optional): A closure that reevaluates the model
and returns the loss.
"""
loss = None
if closure is not None:
loss = closure()
for group in self.param_groups:
weight_decay = group['weight_decay']
momentum = group['momentum']
dampening = group['dampening']
nesterov = group['nesterov']
for p in group['params']:
if p.grad is None:
continue
d_p = p.grad.data
if weight_decay != 0:
d_p.add_(weight_decay, p.data)
if momentum != 0:
param_state = self.state[p]
if 'momentum_buffer' not in param_state:
buf = param_state['momentum_buffer'] = torch.clone(d_p).detach()
else:
buf = param_state['momentum_buffer']
buf.mul_(momentum).add_(1 - dampening, d_p)
if nesterov:
d_p = d_p.add(momentum, buf)
else:
d_p = buf
p.data.add_(-group['lr'], d_p)
return loss
基于上述两方面,优化三步走 (求导和优化是两个步骤)
- 前一次迭代梯度清零(防止梯度累加)
optimizer.zero_grad()
- 反向传播求梯度
l.backward()
- 将更新的值应用到模型参数上
optimizer.step()
2. softmax部分
2.1 torch 和 torchvision
报错: import torchvision时提示ImportError: DLL load failed: 找不到指定的模块
解决: torch 和 torchvision版本是有匹配要求的,我的pytorch是1.1.0版本,试过其他教程提供的torchvision版本 都失败了。按照这个安装导入成功。
pip install torchvision==0.2.2.post3 -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2 jupyter notebook 导入自己写的模块
- 自定义模块,需要是.py文件,不能用
d2lzh_pytorch.ipynb
这样的后缀 - 转化方式,在d2lzh_pytorch.ipynb目录文件下,打开终端,输入
jupyter nbconvert --to script d2lzh_pytorch.ipynb
,转完之后就可以import了