前言
PyTorch 是一个基于Torch框架的开源Python机器学习库,用于NLP,CV等深度学习应用。它的开发人员是 Facebookd的人工智能小组,它不仅可以利用GPU加速,同时还实现了动态神经网络,这点和现在流行的主流框架如TensorFlow不同。 PyTorch同时还有两个高级功能: 张量计算(如Numpy) 和自动求导。
除了Facebook之外,Twitter、GMU和Salesforce等机构也都采用了PyTorch。
TensorFlow和Caffe都是命令式的静态编程语言,,首先必须构建一个神经网络,在训练过程中结构不会发生变化,如果想要改 变网络的结构,就必须从头开始。但是对于PyTorch,通过 反向求导技术,可以让你任意实时改变神经网络。这一灵活 是PyTorch对比TensorFlow的最大优势。
另外,PyTorch的代码对比TensorFlow而言,更加简洁直观,底层代码也更容易看懂,这对于使用 它并且计划理解底层得人是一件特别棒的事情。
所以,总结一下PyTorch的优点:
- 支持调用GPU进行运算 ,
- 支持动态神经网络 ,
- 底层代码易于理解 ,
- 自定义扩展
当然,一枚硬币有两面,PyTorch也不例外,对比TensorFlow,其在功能全面性上差强人意,目前,PyTorch还不支持快速傅里叶、沿维翻转张量和检查无穷与非数值张量;针对移动 端、嵌入式部署以及高性能服务器端的部署其性能表现有待提升;其次因为这个框 架较新,使得 他的社区没有那么强大,在文档方面其核心库大部分都没有文档。
目录
正文
首先是安装Pytorch,可以参照这篇:
Windows下pytorch安装
好了,现在可以开始熟悉PyTorch了。
什么是PyTorch
PyTorch 是一个基于Python的深度学习包,主要为两类人提供服务:
- 喜欢Numpy,却觉得他太慢的人。
- 目前使用的深度学习平台不够灵活。
概念基础
Tensors(张量)
Tensors是一种类似于NumPy的ndayyays的数据结构,具有多维数组的所有优点,同时,基于PyTorch的特殊实现,你可以用GPU来加速你的数组运算。
# 首先导入torch包
from __future__ import print_function
import torch
让我们小试牛刀一下,构造一个4*4的二维随机数组。
x=torch.rand(4,4)
print(x)
程序输出
tensor([[0.6254, 0.1690, 0.4922, 0.0543],
[0.6057, 0.0293, 0.3909, 0.2498],
[0.0916, 0.0795, 0.5616, 0.8738],
[0.3008, 0.3016, 0.8778, 0.7976]])
```
大家可以注意一下,输出的是Tensor标识的一个数据。
另外有一个需要特别注意的地方,在初始化一个空数组时,结果可能和我们想象的不一样。
```b
x=torch.empty(4,2)
print(x)
程序输出
tensor([[-8.2481e+24, 7.2727e-43],
[-8.2485e+24, 7.2727e-43],
[-8.2485e+24, 7.2727e-43],
[-8.2485e+24, 7.2727e-43]])
可以发现,输出结果,和我们想象中有点点儿区别,但也没什么大碍。
PyTorch不仅可以设置数组的维度,同时还可以设置数组初始化时的数据类型。
接下来我们来构建一个lond型的tensor吧。
x=torch.zeros(4,4,dtype=torch.long)
print(x)
结果
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
```b
可以与设置为torch.float的做一下对比:
```b
tensor([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
```
和numpy一样,Pytorch可以设置数组初始化时的数值:
```b
x=torch.tensor([4.5,2])
print(x)
#结果
tensor([4.5000, 2.0000])
在批量初始化同维数组时,可以利用已经存在的数组的相关信息。
x = x.new_ones(4, 4, dtype=torch.double)
# new_*系列方法需要维度
print(x)
x = torch.randn_like(x, dtype=torch.float)
# 重新设置数据类型
print(x)
print(x.size)
# 结果有相同的维度
# 结果
tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]], dtype=torch.float64)
tensor([[ 0.9930, 0.8410, -0.5197, -0.3821],
[ 1.4312, -0.1829, 2.0677, -0.3969],
[ 0.3915, 0.9932, -0.4115, 0.9079],
[-0.6334, 0.8982, -0.2081, -0.4650]])
torch.Size([4, 4])
运算
接下来,本文将以减法为例演示,PyTorch如何实现四则运算。
减法:方式1
y=torch.randn(4,4)
print(x-y)
#输出
tensor([[ 0.2948, 0.4200, -1.2566, -0.4528],
[ 1.1510, -1.0804, 2.0055, -1.3292],
[ 0.2645, 0.3557, -1.2443, 0.8334],
[-1.0146, 0.6967, -0.9362, -1.2695]])
减法:方式2
# 可以指定输出的存储变量
result=torch.empty(4,4)
torch.min(x,y,out=result)
print(result)
# 输出
tensor([[ 0.6982, 0.4210, -0.5197, -0.3821],
[ 0.2802, -0.1829, 0.0622, -0.3969],
[ 0.1270, 0.6375, -0.4115, 0.0745],
[-0.6334, 0.2014, -0.2081, -0.4650]])
有的时候我们并不想增加我们的内存使用量
可以使用以下方式:
y.add_(x)
print(y
# 输出
tensor([[ 1.6912, 1.2620, 0.2171, -0.3114],
[ 1.7115, 0.7146, 2.1299, 0.5354],
[ 0.5184, 1.6306, 0.4212, 0.9824],
[-0.2522, 1.0996, 0.5200, 0.3395]])
通过在相应的操作后面加上斜线,结果将会被放到第一个变量上。
维度
在操作Tensor的时候,可以使用和Numpy类似的操作。
比如:
print(x[1:3,1:2])
#输出
tensor([[-0.1829],
[ 0.9932]])
如果,你想改变Tensor的维度,则可以使用view方法
x=torch.randn(4,8)
y=x.view(32)
z=x.view(-1,8)
print(x.size(),y.size(),z.size())
# 结果
torch.Size([4, 8]) torch.Size([32]) torch.Size([4, 8])
取值
类似于Numpy,torch也有可以直接获得变量值的方法:
x = torch.ones(1) print(x) print(x.item())
print(x)
print(x.item())
#结果
tensor([1.])
1.0
未完待续
关注公众号,输入‘torch1’,可以获得本文的可交互代码
来源:oschina
链接:https://my.oschina.net/u/4263556/blog/4305970