PyTorch优点
上手快:掌握Numpy和基本深度 学习概念即可上手
代码简洁灵活:用nn.module封装使网络搭建更方便;基于动态图机制,更灵活
Debug方便:和调试Python一样简单
文档规范:http://PyTorch.org/docs/可查各版本文档
资源多:arXiv中的新算法大多都有PyTorch实现
开发者多:GitHub上贡献者已超过1350+
背靠大树:FaceBook维护开发
机器学习模型训练步骤 :数据、模型、损失函数、优化器
张量基本概念
张量(torch.Tensor):
一个多维数组,标量、向量、矩阵的高维拓展,在pytorch中是自动求导的关键
张量的主要属性(8个,4个与梯度求导相关,4个与数据相关):
data:被包装的tensor
grab:data的梯度
grab_fn:创建Tensor的Function,是自动求导的关键
require_grad:指示是否需要梯度
is_leaf:指示是否是叶子节点(张量)
dtype:张量的数据类型
shape:张量的形状,如(53,3,224,224)
device:张量所在设备,GPU/CPU,是加速的关键
创建张量:
一、直接创建:
torch.tensor(
data,#数据,可以是list,numpy
dtype=None,#数据类型,默认与data一致
device=None,#所在设备,cuda/cpu
require_grad=False,#是否需要梯度
pin_memory=False#是否存于锁页内存
)
torch.from_numpy(ndarray)
#从torch.from_numpy创建的tensor与原ndarray共享内存
二、依据数值创建
torch.zeros(#依size创建全0张量
*size,#张量的形状,如(3,3)、(3,224,224)
dtype=None,#输出的张量
device=None,#内存中布局形式,有strided,sparse_coo等
require_grad=False,#所在设备,gpu/cpu
pin_memory=False#是否需要梯度
)
torch.zeros_like(#依input形状创建全0张量
input,#创建与input同形状的全0张量
dtype=None,#数据类型
layout=None,#内存中布局形式
device=None,
requires_grad=False
)
torch.ones(#依size创建全1张量
*size,#张量的形状,如(3,3)、(3,224,224)
dtype=None,#输出的张量
device=None,#内存中布局形式,有strided,sparse_coo等
require_grad=False,#所在设备,gpu/cpu
pin_memory=False#是否需要梯度
)
torch.ones_like(#依input形状创建全1张量
input,#创建与input同形状的全0张量
dtype=None,#数据类型
layout=None,#内存中布局形式
device=None,
requires_grad=False
)
torch.full(#依input形状创建自定义张量
size,#张量的形状,如(3,3)
fill_value,#张量的值
dtype=None,
layout=None,
device=None,
requires_grad=False
)
三、依据概率创建
torch.arange(#创建等差的1维张量
star=0,#数列起始值
end,#数列"结束值"
step=1,#数列公差,默认1
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False
)
torch.linspace(#创建均分的1维张量
star=0,#数列起始值
end,#数列结束值
steps=100,#数列长度
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False
)
torch.logspace(#创建对数均分的1维张量
star=0,#数列起始值
end,#数列结束值
steps=100,#数列长度
base=10.0,#对数函数的底,默认10
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False
)
torch.eye(#创建单位对角矩阵(2维张量)
n,#矩阵行数
m=None,#矩阵列数
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False
)
torch.normal(#生成正态分布(高斯分布)
mean,#均值
std,#标准差
out=None
)
torch.randn(#生成标准正态分布,同torch_randn_like(),在区间[0,1)上生成均匀分布
*size,#张量的形状
out=None,
dtype=None,
device=None,
require_grad=False,
pin_memory=False
)
torch.randint(#区间[low,high)生成整数均匀分布
low=0,
high,
size,#张量的形状
out=None,
dtype=None,
device=None,
require_grad=False,
pin_memory=False
)
torch.randperm(#生成从0到n-1的随机排列
n,#张量的长度
out=None,
dtype=torch.int64,
layout=torch.strided,
device=None,
requires_grad=False
)
torch.bernoulli(#以input为概率,生成伯努利分布(0-1分布,两点分布)
input,#概率值
generator=None,
out=None
)