PyTorch学习笔记
张中逸
第一部分:PyTorch入门
基础内容
准备
import torch as t
初始化
x = t.Tensor(5,3) #只是初始化
x = t.rand(5,3) #生成(0,1)上随机数
Torch.size
是tuple
对象的子类,支持所有tuple
类的操作
基本运算(加法)
#加法#
x = t.rand(5,3)
y = t.rand(5,3)
#表达方式1:z = x + y#
#表达方式2:z = t.add(x,y)#
#表达方式3:z = t.rand(5,3);z = t.add(x,y,out = z)#
#---------------#
#自增#
x.add_(1) #所有元素加1#
下划线
x = t.rand(5,3)
y = t.rand(5,3)
#y本身不变的表达,返回新的Tensor:y = t.add(x)#
#y本身改变的表达,等价于y = y + x:y = t.add_(x)#
选取
print(x[:,1]) #打印第一列,从0开始数#
Tensor与numpy转换
Tensor不支持的操作可以先转换为numpy再转回Tensor
numpy是一种数组表示
两者共享内存(一起改变),转换速度快
#Tensor--->numpy#
a = t.ones(5)
b = a.numpy()
#numpy--->Tensor#
import numpy as np
a = np.ones(5)
b = t.from_numpy(a)
CUDA转换
#转换为GPU的Tensor,享受加速#
if t.cuda.is_available():
x = x.cuda()
y = y.cuda()
自动微分
autograd.Variable
是Autograd
中的核心类,它简单封装了Tensor,并支持几乎所有Tensor的操作。Tensor在封装为Variable
之后,可以调用它的.backward
实现反向传播,自动计算所有的梯度。
Variable
主要包含三个属性:
data
:保存Variable
包含的Tensorgrad
:保存data对应的梯度,其本身也是一个Variable
而不是Tensorgrad_fn
:指向一个Function对象
使用Tensor新建一个Variable
from torch.autograd import Variable
import torch as t
x = Variable(t.ones(2,2), requires_grad = True) #产生一个2*2的全1矩阵
y = x.sum() #这个类型还是一个Tensor
y.grad_fn #求一个对象,之后再说
y.backward() #求一次反向传播
x.grad #求x的梯度,这里是对x的位置求导
这里关键在于这个backward()
函数,可以得到一个通用的公式:在k.backward(p)
作用后,x
的梯度为 x . g r a d = p ∗ d k d x x.grad=p*\frac{dk}{dx} x.grad=p∗dxd