发布时间:2025-01-24 14:01
PyTorch
是一个针对深度学习, 并且使用GPU
和CPU
来优化的tensor library
(张量库)。
学过Tensorflow
的人或许有话说,这些事情Tensorflow
也能做到的呀?那么pyTorch
到底有什么可以很快在深度学习爱好者中迅速发展起来的呢?其实相比较于Tensorflow
,两者还是存在不同之处——
PyTorch
更有利于研究人员、爱好者、小规模项目等快速搞出原型。而TensorFlow
更适合大规模部署,特别是需要跨平台和嵌入式部署时。PyTorch
本质上是Numpy
的替代者,而且支持GPU
、带有高级功能,可以用来搭建和训练深度神经网络。而TensorFlow
可以看成是一个嵌入Python
的编程语言。我们所写的TensorFlow
代码会被Python
编译成一张图,然后由TensorFlow
执行引擎运行。Tensorflow
会表现出更突出的优势。使用TensorFlow
,部署在Android
或iOS
平台时只需要很小的工作量,至少不必用Java
或者C++
重写模型的推断部分。对于高性能服务器端的部署,还有TensorFlow Serving
能用。除了性能之外,TensorFlow Serving
一个显著的优点是可以轻松的热插拔模型,而不会使服务失效。如果之前学习了Tensorflow的朋友们,应该对PyTorch的部署和安装会信手拈来。但是对于初学者来说,需要花一点时间进行摸索。
参考官网配置方法PyTorch官网可以进行安装。因为文件过大,下载过程中出现超时现象,使用清华镜像进行下载,速度比较块。当前操作系统Window10,其他系统可直接参考官网详细说明。
## 在安装之前需要确认cuda是否成功安装并在系统中使用
conda --version
## 下载相关文件,需要注意cuda和pyTorch的版本对应关系!!
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
## 安装
pip install pytorch cuda90 -c pytorch
pip install torchvision
如果通过镜像下载不下来,可以直接到**torch下载链接**进行下载,然后执行安装命令就可以。
# 离线安装相对应的版本
python install torchvision-0.3.0-py2.py3-none-any.whl
python install torch-1.1.0-cp36-cp36m-win_amd64.whl #python36,windowns 64
检测是否安装成功
## 检测是否安装成功
python
>> import torch
>> import torchvision
>> torch.cuda.is_available()
True #显示True表示安装成功,并且可用
张量
在数学中,就是一个多维数组,它是标量、向量、矩阵的高维拓展。
标量
是一个0维张量,向量
是一个1维张量,矩阵
是一个2维张量,但是有些高维数值就无法用标量、向量、矩阵来表示了,比如彩色图片的像素点,其中还包括RGB通道的,那么此时就需要进行高维拓展——张量。
但是在PyTorch中张量不仅仅表示多维数组,也是自动求导的关键。其中Variable
是PyTorch-0.4.0
版本之前的一个数据类型,虽然在0.4.0版本
之后已经并入Tensor
中,但是Variable
这个数据类型还是需要了解的。这个数据类型和Tensorflow-1.0版本中的Variable还是有所不同之处。在Pytorch中,Variable主要是用于封装Tensor,进行自动求导
。
PyTorch的数据类型总共有9种数据类型,其中使用频率最高的是torch.float32
或者torch.float
和torch.int64
或者torch.long
。比如前者主要使用到卷积层的权值和图像处理中都默认float32
,后者主要是在交叉熵或者计算损失函数中会用到的比较多。
## 直接创建rensor
torch.tensor(
data,
dtype=None,
device=None,
requires_grad=False,
pin_memory)
## data——数据,可以是list,numpy
## dtype——数据类型,默认与data一致
## device——cpu或者cuda
## requires_grad——是否需要自动求导
## pin-memory——是否存于锁页内存,与转换效率有关
第二种
## 从numpy创建tensor
torch.from_numpy(ndarray)
使用这种方法创建的tensor和ndarray是共享内存的,当修改任意一个的数据,另一个数据也会被修改的!!!
第一种
## 根据size创建全0张量
torch.zeros(*size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
## 根据size创建全1的张量
torch.ones(*size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
size
:张量的形状,比如(3,3),(3,224,224)
out
:输出的张量
layout
:内存中的布局形式,有strided
、sparse_coo
(稀疏矩阵时可以使用,提高读取速度)等
device
:所在设备,cuda/cpu
第二种
## 根据input创建全0的张量
torch.zeros_like(input,
dtype=None,
layout=None,
device=None,
requires_grad=False)
## 根据input创建全0的张量
torch.ones_like(input,
dtype=None,
layout=None,
device=None,
requires_grad=False)
第三种
## 使用full方法来创建张量
torch.full(size,
full_value,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
## 使用full_like方法来创建张量
torch.full_like(size,
full_value,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
full_value
:张量的值。
第四种
## 创建等差的1维张量
torch.arange(start=0,
end,
step=1,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
## 创建均分的1维张量,其数值区间是[start,end]
torch.linspace(start=0,
end,
steps=100,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
## 创建对数均分的1维张量,长度维steps,底为base
torch.linspace(start=0,
end,
steps=100,
base=10.0,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
start
:数列的起始值
end
:数列的“结束值”
step
:等差数列中表示数列公差,默认为1
steps
:均分中表示数列长度
base
:对数函数的底,默认是10
第五种
## 创建单位对角矩阵(2维张量),默认是方阵
torch.eye(n,
m=None,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
n
:矩阵行数
m
:矩阵列数
第一种
## 正态分布(高斯分布)
torch.normal(mean,
std,
out=None)
## 存在四种模式,mean分别是标量和张量,std也分别存在标量和张量两种情况,每一种情况生成的张量都是不全相同的。
torch.normal(mean,
std,
size,
out=None)
## 标准正态分布
torch.randn(*size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
#或者
torch.randn_like(*size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
mean
:均值
std
:标准差
size
:张量的形状
第二种
## 在[0,1]之间生成均匀分布
torch.rand(*size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
# 或者
torch.rand_like(*size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
## 在[low,high)之间生成整数均匀分布
torch.randint(low=0,
high,
size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
# 或者
torch.randint_like(low=0,
high,
size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
第三种
## 生成从0到n-1的随机排列
torch.randperm(n,
out=None,
dtype=torch.int64,
layout=torch.strided,
requires_grad=False)
n
:张量的长度
第四种
## 以input为概率,生成伯努利分布(0-1分布)
torch.bernoulli(input,
*,
generator=None,
out=None)
input
:概率值