2 PyTorch基础知识
2.1 安装与配置
人工智能工具库(Anaconda/Pytorch/PyCharm等)安装环境配置视频教程
重新创建并切换使用虚拟环境的步骤:
- 退出当前虚拟环境:
conda deactivate
- 创建虚拟环境:
conda create -n pytorch_1.7 python=3.6
- PyTorch官网本地下载链接:https://download.pytorch.org/whl/torch_stable.html
- 激活进入虚拟环境:
conda activate pytorch_1.7
- 清华镜像源安装PyToch1.7:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ "torch-1.7.1+cu110-cp36-cp36m-win_amd64.whl"
- 安装torchvision0.8:
pip install "torchvision-0.8.2+cu110-cp36-cp36m-win_amd64.whl"
- 更新PyCharm的python解释器:File—》Settings —》Project: python36_torch —》Python Interpreter—》Add—》Conda Environment—》Existing environment—》Interpreter—》“D:\SoftwareTool\Anaconda3\envs\pytorch_1.7\python.exe”
2.2 张量(Tensor)
2.2.1 概念
张量是一个多维数组,它是标量、向量、矩阵的高维拓展
Variable是torch.autograd中的数据类型,主要用于封装Tensor,进行自动求导
参数说明:
-
data:被封装的Tensor
-
grad:data的梯度(偏导数)
-
grad_fn:创建Tensor的Function,是自动求导的关键,记录创建该张量时所用的方法(函数)
-
requires_grad:指示是否需要梯度
-
is_leaf:指示是否为叶子结点(张量)【用户创建的结点(张量)称为叶子结点(张量)】
PyTorch0.4.0版开始,Variable并入Tensor
参数说明:
- dtype:张量的数据类型,如torch.FloatTensor, torch.cuda.FloatTensor
- shape:张量的形状,如(64,3,224,224)
- device:张量所在设备(GPU/CPU),是加速的关键
2.2.2 创建方法
常见三种创建方法:
直接创建
依据数值创建
依据概率分布创建
1 直接创建
1.1 torch.tensor()
功能:从data创建tensor
参数说明:
- data:数据,可以是list、numpy
- dtype:数据类型,默认与data的一致
- device:所在设备(GPU/CPU)
- requires_grad:是否需要梯度
- pin_memory:是否存于锁页内存
1.2 torch.from_numpy(ndarray)
功能:从numpy创建tensor
注意事项:从torch.from_numpy创建的tensor于原ndarray共享内存,当修改其中一个的数据,另外一个也将会被改动
2. 依据数值创建
2.1 torch.zeros()
功能:根据size创建全0张量
参数说明:
- size:张量的形状,如(3,3)、(3,224,224)
- out:输出的张量
- layout:内存中布局形式,有strided, sparse_coo等
- device:所在设备(GPU/CPU)
- requires_grad:是否需要梯度
2.2 torch.zeros_like()
功能:根据input形状创建全0张量
参数说明:
- input:创建与input同形状的全0张量
- dtype:数据类型
- layout:内存中布局形式
2.3 torch.ones()
功能:根据size创建全1张量
参数说明:
- size:张量的形状,如(3,3)、(3,224,224)
- out:输出的张量
- layout:内存中布局形式,有strided, sparse_coo等
- device:所在设备(GPU/CPU)
- requires_grad:是否需要梯度
2.4 torch.ones_like()
功能:根据input形状创建全1张量
参数说明:
- input:创建与input同形状的全1张量
- dtype:数据类型
- layout:内存中布局形式
2.5 torch.full()
功能:根据size创建自定义的数值张量
参数说明:
- size:张量的形状,如(3,3)、(3,224,224)
- fill_value:张量的值
2.6 torch.full_like()
功能:根据input形状创建自定义的数值张量
2.7 torch.arange()
功能:创建等差的1维张量
注意事项:数值区间为[start,end),即左闭右开
参数说明:
- start:数列起始值
- end:数列结束值
- step:数列公差,即步长,默认为1
2.8 torch.linspace()
功能:创建均分的1维张量
注意事项:长度为steps,数值区间为[start,end],即左闭右闭
参数说明:
- start:数列起始值
- end:数列结束值
- steps:数列长度,即均分数
2.9 torch.logspace()
功能:创建对数均分的1维张量
注意事项:长度为steps,底为base
参数说明:
- start:数列起始值
- end:数列结束值
- steps:数列长度,即均分数
- base:对数函数的底,默认为10
2.10 torch.eye()
功能:创建单位对角矩阵(2维张量)
注意事项:默认为方阵
参数说明:
- n:矩阵行数
- m:矩阵列数
3 依据概率分布创建
3.1 torch.normal()
功能:生成正态分布(高斯分布)张量
参数说明:
- mean:均值
- std:标准差
四种模式:
- mean为标量,std为标量:需增加设置size参数(张量的形状)
- mean为标量,std为张量
- mean为张量,std为标量
- mean为张量,std为张量
3.2 torch.randn()
功能:根据size生成标准正态分布(高斯分布)张量
参数说明:
- size:张量的形状
3.3 torch.randn_like()
功能:根据input形状生成标准正态分布(高斯分布)张量
3.4 torch.rand()
功能:在区间[0,1)上,根据size生成均匀分布张量
参数说明:
- size:张量的形状
3.5 torch.rand_like()
功能:在区间[0,1)上,根据input形状生成均匀分布张量
3.6 torch.randint()
功能:在区间[low,high)上,根据size生成整数均匀分布张量
参数说明:
- size:张量的形状
3.7 torch.randint_like()
功能:在区间[low,high)上,根据input形状生成整数均匀分布张量
3.8 torch.randperm()
功能:生成从0到n-1的随机排列张量
参数说明:
- n:张量的长度
3.9 torch.bernoulli()
功能:以input为概率,生成伯努利分布(0-1分布/两点分布)张量
参数说明:
- input:概率值
代码实现:
import numpy as np
import torch
# -------------------------------example 1------------------------------------
# 通过torch.tensor创建张量
flag=True
if flag:
arr1=np.ones((3,3))
print("ndarray的数据类型:",arr1.dtype)
t1=torch.tensor(arr1)
# t=torch.tensor(arr1,device="cuda") # 使用GPU
print(t1)
print("\n")
# -------------------------------example 2------------------------------------
# 通过torch.from_numpy创建张量
flag=True
if flag:
arr2=np.array([[1,2,3],[4,5,6]])
t2=torch.from_numpy(arr2)
# print("numpy array:",arr2)
# print("tensor:",t2)
# print("\n修改arr")
# arr2[0,0]=0
# print("numpy array:",arr2)
# print("tensor:",t2)
print("\n修改tensor")
arr2[0,0]=-1
print("numpy array:",arr2)
print("tensor:",t2)
print("\n")
# -------------------------------example 3------------------------------------
# 通过torch.zeros建张量
flag=True
if flag:
out_t=torch.tensor([1])
t3=torch.zeros((3,3),out=out_t)
print("t3:\n",t3)
print("out_t:\n",out_t)
print(id(t3),id(out_t),id(t3)==id(out_t))
print("\n")
# -------------------------------example 4------------------------------------
# 通过torch.full创建全1张量
flag=True
if flag:
t4=torch.full((3,3),fill_value=1)
print("t4:\n",t4)
print("\n")
# -------------------------------example 5------------------------------------
# 通过torch.arange创建等差数列张量
flag=True
if flag:
t5=torch.arange(2,10,2) # 步长为2,左闭右开
print("t5:\n",t5)
print("\n")
# -------------------------------example 6------------------------------------
# 通过torch.linspace创建均分数列张量
flag=True
if flag:
t6=torch.linspace(2,10,5) # 均分为5个数,左闭右闭
print("t6:\n",t6)
print("\n")
# -------------------------------example 7------------------------------------
# 通过torch.normal创建正态分布张量
flag=True
if flag:
# 模式1: mean:张量 std:张量
mean=torch.arange(1,5,dtype=torch.float)
std=torch.arange(1,5,dtype=torch.float)
t7=torch.normal(mean,std)
print("mean:{}\nstd:{}".format(mean,std))
print("t7:\n",t7)
print("\n")
# 模式2: mean:标量 std:标量
mean=0
std=1
t8=torch.normal(mean,std,size=(4,)) # mean和std都是标量时需设置size(张量的形状)
print("mean:{}\nstd:{}".format(mean,std))
print("t8:\n",t8)
print("\n")
# 模式3: mean:张量 std:标量
mean=torch.arange(1,5,dtype=torch.float)
std=1
t9=torch.normal(mean,std)
print("mean:{}\nstd:{}".format(mean,std))
print("t9:\n",t9)
print("\n")
# 模式4: mean:标量 std:张量
mean=0
std=torch.arange(1,5,dtype=torch.float)
t10=torch.normal(mean,std)
print("mean:{}\nstd:{}".format(mean,std))
print("t10:\n",t10)
2.2.3 张量操作
常见四种操作:
- 拼接
- 切分
- 索引
- 变换
-
拼接
-
torch.cat()
功能:将张量按维度dim进行拼接参数说明:
- tensors:张量序列
- dim:拼接的维度(dim=0:行维度)
-
torch.stack()
功能:在新创建的维度dim上将张量进行拼接注意事项:使用时会增加维度
参数说明:
- tensors:张量序列
- dim:拼接的维度
-
-
切分
-
torch.chunk()
功能:将张量按维度dim进行平均切分返回值:张量列表
注意事项:若不能整除,最后一份张量小于其他张量
参数说明:
- input:切分的张量
- chunks:切分的份数
- dim:切分的维度
-
torch.split()
功能:将张量按维度dim进行切分返回值:张量列表
参数说明:
- tensor:切分的张量
- split_size_or_sections:为int时,表示每一份的长度;为list时,按list元素切分
- dim:切分的维度
-
-
索引
-
torch.index_select()
功能:在维度dim上,按index索引数据返回值:根据index索引数据拼接的张量
参数说明:
- input:索引的张量
- dim:索引的维度
- index:索引数据的序号
-
torch.masked_select()
功能:按mask中的True进行索引返回值:一维张量
参数说明:
- input:索引的张量
- mask:与input同形状的布尔类型张量
-
-
变换
-
torch.reshape()
功能:变换张量形状注意事项:当张量在内存中是连续时,新张量与input共享数据内存
参数说明:
- input:变换的张量
- shape:新张量的形状
-
torch.transpose()
功能:交换张量的两个维度参数说明:
- input:变换的张量
- dim0:交换的维度
- dim1:交换的维度
-
torch.t()
功能:2维张量转置,对矩阵而言,等价于torch.transpose(input,0,1) -
torch.squeeze()
功能:压缩长度为1的维度(轴)参数说明:
- dim:若为None,移除所有长度为1的轴;若指定维度,当且仅当该轴长度为1时,可以被移除
-
torch.unsqueeze()
功能:依据dim扩展维度(轴)参数说明:
- dim:扩展的维度
-
2.2.4 数学运算
- 加减乘除
- 对数、指数、幂函数
- 三角函数
-
加减乘除
-
torch.add()
功能:逐个元素计算input+alpha*other参数说明:
- input:第一个张量
- alpha:乘项因子
- other:第二个张量
-
torch.addcmul()
功能:(加法结合乘法)逐个元素计算input+value*tensor1*tensor2 -
torch.addcdiv()
功能:(加法结合除法)逐个元素计算input+value*tensor1/tensor2
-
-
对数、指数、幂函数
-
三角函数
2.3 计算图
计算图是用来描述运算的有向无环图
计算图有两个主要元素:结点(Node)
和边(Edge)
-
结点表示数据
,如向量、矩阵、张量 -
边表示运算
,如加减乘除卷积等
用计算图表示:y=(x+w)*(w+1)
-
叶子结点:用户创建的结点(张量),如X与W
is_leaf
:指示张量是否为叶子结点(张量)
-
grad_fn
:记录创建该张量时所用的方法(函数)
2.4 PyTorch动态图机制
根据计算图搭建方式,可将计算图分为
动态图
和静态图
- 动态图:运算与搭建
同时
进行- 静态图:
先
搭建图,后
运算
2.5 autograd(自动求导)
-
torch.autograd.backward()
功能:自动求取梯度参数说明:
- tensors:用于求导的张量,如loss
- grad_tensors:设置多梯度权重
- retain_graph:保存计算图,设置为True以便后面再次使用计算图(反向传播)
- create_graph:创建导数计算图,用于高阶求导
-
torch.autograd.grad()
功能:自动求取梯度参数说明:
- outputs:用于求导的张量,如loss
- inputs:需要梯度的张量
- grad_outputs:设置多梯度权重
- retain_graph:保存计算图,设置为True以便后面再次使用计算图(反向传播)
- create_graph:创建导数计算图,一阶求导时需设置create_graph=True用于高阶求导
autograd 注意事项
:
- 梯度不自动清零,即需使用w.grad.zero_()方法进行梯度清零,以防止梯度一直累加
- 依赖于叶子结点的结点,requires_grad默认为True
- 叶子结点不可执行inplace(原位/原地操作),即会改变内存地址