命令附录:
- torch.empty 没有初始化
- torch.rand 随机初始化
- torch.zeros 0初始化
- torch.tensor 使用数据进行初始化
- x.new_ones new_*可以指定size
- torch.randn_like 使用既有的tensor进行初始化
- x+y、torch.add(x, y)、torch.add(x, y, out=result)
- y.add_(x) 原地加 命令后面带上“_”的都是原地操作。
- torch.view 可以resize/reshape tensor
- 参数为-1,是说该值可以从其他维度推算出来
- tensor.item() 得到python的数值
- tensor.numpy() 可以得到对应的numpy形式,注意共享内存
- torch.from_numpy(a) a是是numpy类型,将numpy转化为tensor
- device = torch.device(“cuda”) 返回一个CUDA device object
- y = torch.ones_like(x, device=device) 直接创建一个GPU-Tensor
- x = x.to(device) cpu-tensor转化为gpu-tensor
- z.to(“cpu”, torch.double) to除了可以转换设备,也可以转换类型。
WHAT IS PYTORCH?
- pytorch基于python,有两点优势:可以代替numpy使用GPU进行科学计算;是一个深度学习的研究平台,提供了最大的灵活性和速度。
GETTING STARTED
Tensors
- torch.Size 是一个tuple。
Operations
- 同一个操作可能有多个语法。
- Numpy的索引操作都适用于Tensor。
NUMPY BRIDGE
- Tensor可以与Numpy array轻易转换,但要注意两者共享内存,双向转换都是共享内存。
- 除了char类型的tensor,cpu上的tensor都可以和numpy相互转化。根据这句话,我推断gpu上的tensor不可以。
CUDA TENSORS
- 使用to,可以将tensor在设备之间进行转化。
AUTOGRAD: AUTOMATIC DIFFERENTIATION
autograd包提供自动微分。
TENSOR
- 只要将tensor的属性.requires_grad设置为true,就可以追踪到在它上面执行的操作。
- 完成前向计算后,执行.backward(),就可以自动计算梯度,然后梯度被保存在.grad属性中。
- detach()解释1、detach()解释2 我理解就是新拷贝了一个tensor,并且该tensor不会影响到老的计算图的梯度计算。如果对它更改了数值,会报错。
- torch.no_grad()的范围内,不会对requires_grad=True的tensor进行梯度计算。
- Tensor和Function交互,并且组成了一个无环图。如果一个tensor是由function产生的,则它.grad_fn的属性就会指向这个function。用户自定义tensor的.grad_fn是None。
- tensor是标量,则调用.backward()不需要参数,否则需要。
GRADIENTS
- torch.autograd计算的是Jacobian-vector product。如果一个表达式的结果是向量,则梯度是Jacobian matrix,因此需要提供一个vector相乘,才能得到autograd的计算结果。
NEURAL NETWORKS
- nn.Module包含layer,并且提供一个返回output的forward函数。
DEFINE THE NETWORK
- init初始化各个layer。forward定义网路结构,将各层联结起来。无需backward。
- torch.nn只支持mini-batche,不支持单个训练样本。
- 每一个Function节点都连接着一个Function,并编码该Function创建的Tensor的历史。
LOSS FUNCTION
BACKPROP
- 别忘了使用zero_grad清除梯度的历史累积量。
UPDATE THE WEIGHTS
- 为了使用各种优化器,则使用optimizer.step(),对模型进行更新。
- optimizer的初始化用到了net.parameters和learning rate。
TRAINING A CLASSIFIER
WHAT ABOUT DATA?
- torchvision.datasets包提供公开数据集,torch.utils.data.DataLoader提供对数据的转换。
- 本章教程的源代码比较多,可以参考,是规范的。但是我的学习笔记没有列出,没有必要,代码结构很清晰了。
TRAINING AN IMAGE CLASSIFIER
- 加载、转换数据,划分训练集和测试集。
- 定义CNN的网络结构。
- 定义损失函数。
- 使用训练集训练网络。
- 使用测试集测试模型。
TRAINING ON GPU
- 模型和数据都要使用to,从cpu迁移到gpu上。其中,数据要进行覆盖。
OPTIONAL: DATA PARALLELISM
- pytorch默认值使用单个GPU。因此如果使用数据并行,需要对模型进行封装:model = nn.DataParallel(model)。