《动手学深度学习 pytorch版》代码笔记——第1-4章

主要参考文档
【1】《动手学深度学习 pytorch版》
【2】《动手学深度学习》

对着敲代码时常会遇到零星问题,本篇博客意在记录实现过程中琐碎知识点,边学边记~

目录

  • 1. 线性回归部分
    • 1.1 数据类型问题
    • 1.2 optimizer.step()
  • 2. softmax部分
    • 2.1 torch 和 torchvision
    • 2.2 jupyter notebook 导入自己写的模块

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 的形状、数据类型、设备、是否需要梯度的信息。

PyTorch代码调试利器: 自动print每行代码的Tensor信息

  • 第一步 pip install torchsnooper
  • 第二步 @torchsnooper.snoop() 装饰下要调试的函数即可
@torchsnooper.snoop()
def linreg(X, w, b):
    return torch.mm(X, w) + b

《动手学深度学习 pytorch版》代码笔记——第1-4章_第1张图片

1.2 optimizer.step()

Pytorch optimizer.step() 和loss.backward()和scheduler.step()的关系与区别 (Pytorch 代码讲解)

优化器工作需要两个东西

optimizer = optim.SGD(net.parameters(), lr=0.03)
  1. 当前网络/其他模型的参数空间,于是上图中传入 net.parameters()
  2. 反向传播的梯度信息,下方为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

基于上述两方面,优化三步走 (求导和优化是两个步骤)

  1. 前一次迭代梯度清零(防止梯度累加)optimizer.zero_grad()
  2. 反向传播求梯度 l.backward()
  3. 将更新的值应用到模型参数上 optimizer.step()

2. softmax部分

2.1 torch 和 torchvision

import torchvision时提示ImportError: DLL load failed: 找不到指定的模块

报错: 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 导入自己写的模块

jupyter运行py文件(py文件和ipynb文件互转)

  • 自定义模块,需要是.py文件,不能用 d2lzh_pytorch.ipynb 这样的后缀
  • 转化方式,在d2lzh_pytorch.ipynb目录文件下,打开终端,输入 jupyter nbconvert --to script d2lzh_pytorch.ipynb,转完之后就可以import了

你可能感兴趣的:(实例)