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() - 使用GPU
device = 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对象以顺序方式运行其中包含的每个模块,用于快速创建模型
