Pytorch学习记录

神经网络

  • torch.Tensor-一个多维数组,支持诸如backward()的自动微分操作,同时保持相对于张量的梯度。
  • nn.Module-神经网络模块,在创建类时继承。 封装参数的便捷方法,并带有将其移动到 GPU,导出、加载等的帮助器。
  • nn.Parameter-一种张量,即将其分配为Module的属性时,自动注册为参数。
  • autograd.Function-实现自动微分操作的正向和反向定义。 每个Tensor操作都会创建至少一个Function节点,该节点连接到创建Tensor的函数,并且编码其历史记录。
  • 调用loss.backward()时,反向传播误差,不过需要清除现有梯度,否则梯度将累积到现有梯度中。同时,整个图将被微分,并且图中具有requires_grad=True的所有张量将随梯度累积其.grad张量。
  • 更新权重方法:随机梯度下降(SGD),weight = weight - learning_rate * gradient.使用封装的库torch.optim动量momentum是随机梯度下降的一种变体,它也考虑了以前的更新,通常可以加快训练速度
  • 循环内部:清除梯度、输入forward得到输出、输出根据误差计算准则得到loss、loss通过backward更新梯度、optimizer更新模型参数

分类器

  • 视觉包torchvision,用于数据集加载与标准化,数据集的输出是[0, 1]范围的PILImage图像
  • 用于数据集合(数据和标签),torch.utils.data,类型为Dataset
  • 用于数据迭代torch.utils.data.DataLoader()
  • 批处理大小batch_size。优点:内存小,更新参数次数更多。缺点:批次内样本树太少,梯度估计不准确
  • 模型保存net.state_dict(),文件后缀为.pth,应该是仅保存了模型的参数。
  • 模型加载load_state_dict()
  • 使用GPUdevice = torch.device("cuda:0" if torch.cuda.is_available() else "cpu"),将其参数和缓冲区转换为 CUDA 张量net.to(device),每一步的输入和目标发送到GPUinputs, labels = data[0].to(device), data[1].to(device)
  • torch.no_grad() 是一个上下文管理器,被该语句wrap起来的部分将不会track梯度
  • Sequential对象以顺序方式运行其中包含的每个模块,用于快速创建模型