什么是Pytorch
Pytorch是一个基于Numpy的科学计算包,向它的使用者提供了两大功能。作为Numpy的替代者,向用户提供使用GPU强大功能的能力。做为一款深度学习的平台,向用户提供最大的灵活性和速度。
基本元素操作
Tenors张量:张量的概念类似于Numpy中的ndarray数据结构,最大的区别在于Tensor可以利用
GPU的加速功能。
引用
from __future__ import print_functionimport torch
创建矩阵
未初始化矩阵 (脏数据)
x=torch.empty(5,3)
初始化矩阵
x=torch.rand(5,3)
全零矩阵
x=torch.zeros(5,3,dtype=torch.long)
dtype可以设置数据类型
创建张量
x=torch.tensor([[1,2],[3,4]])
创建同尺寸的张量(数据随机)
x=x.new_ones(5,3,dtype=torch.double)y=torch.rand_like(x,dtype=torch.float)
张量的尺寸(返回的是元组)
x=x.new_ones(5,3,dtype=torch.double)x.size()
基本运算操作
加法操作
x,y尺寸相同
x+y
尺寸相同和上个方法一致
torch.add(x,y)
把结果存入result
result=torch.empty(5,3)torch.add(x,y,out=result)
就地置换(存入x)
x.add_(y)
所有就地置换函数都有_的后缀
切片操作
和numpy几乎一致
改变张量形状(-1在前匹配列,在后或没有匹配行)
取出唯一个元素
x.item()
与其他格式的相互转换
tensor转numpy array
b=x.numpy()
注意:如果对其中一个数据操作,另一个也会随之发生改变
numpy array转tensor
a=np.ones(5)b=torch.from_numpy(a)
注意:如果对其中一个数据操作,另一个也会随之发生改变
cuda tensor
if torch.cuda.is_available():device = torch.device("cuda")y=torch.ones_like(x,device=device)x=x.to(device)z=x+yprint(z)print(z.to("cpu",torch.double))
autograd
在整个Pytorch框架中,所有的神经网络本质上都是一个autogradpickage(自动求导工具包)。
autogradpackage提供了一个对Tensors上所有的操作进行自动微分的功能。
torch.Tensor
requires_grad
torch.Tensor是整个package中的核心类,如将属性requires_grad设置为True,它将追踪在这个类上定义的所有操作,当代码要进行反向传播的时候,直接调用backward()就可以自动计算所有的梯度.在这个Tensor上的所有梯度将被累加进属性grad中。
x = torch.ones(2, 2, requires_grad=True)y=x+2print(x.grad_fn)print(y.grad_fn)
改变requires_grad属性
x.requires_grad_(True)
detach()
如果想终止一个Tensor在计算图中的追踪回溯,只需要执行detach()就可以将该Tensor从计算图中撤下,在未来的回溯计算中也不会再计算该Tensor。
除了detach(),如果想终止对计算图的回溯,也就是不再进行方向传播求导数的过程,也可以采用代码块的方式withtorch.no_grad():,这种方式非常适用于对模型进行预测的时候,因为预测阶段不再需要对梯度进行计算.
torch.Function
Function类是和Tensor类同等重要的一个核心类,它和Tensor共同构建了一个完整的类,每一个Tensor拥有一个grad_fn属性,代表引用了哪个具体的Function创建了该Tensor。
如果某个张量Tensor是用户自定义的,则其对应的grad_fnisNone。