Pytorch实践中文教程(1)

≯℡__Kan透↙ 提交于 2020-08-13 00:55:37

前言

PyTorch 是一个基于Torch框架的开源Python机器学习库,用于NLP,CV等深度学习应用。它的开发人员是 Facebookd的人工智能小组,它不仅可以利用GPU加速,同时还实现了动态神经网络,这点和现在流行的主流框架如TensorFlow不同。 PyTorch同时还有两个高级功能: 张量计算(如Numpy) 和自动求导。
除了Facebook之外,Twitter、GMU和Salesforce等机构也都采用了PyTorch。
TensorFlow和Caffe都是命令式的静态编程语言,,首先必须构建一个神经网络,在训练过程中结构不会发生变化,如果想要改 变网络的结构,就必须从头开始。但是对于PyTorch,通过 反向求导技术,可以让你任意实时改变神经网络。这一灵活 是PyTorch对比TensorFlow的最大优势。
另外,PyTorch的代码对比TensorFlow而言,更加简洁直观,底层代码也更容易看懂,这对于使用 它并且计划理解底层得人是一件特别棒的事情。
所以,总结一下PyTorch的优点:



  1. 支持调用GPU进行运算
  2. 支持动态神经网络
  3. 底层代码易于理解
  4. 自定义扩展
    当然,一枚硬币有两面,PyTorch也不例外,对比TensorFlow,其在功能全面性上差强人意,目前,PyTorch还不支持快速傅里叶、沿维翻转张量和检查无穷与非数值张量;针对移动 端、嵌入式部署以及高性能服务器端的部署其性能表现有待提升;其次因为这个框 架较新,使得 他的社区没有那么强大,在文档方面其核心库大部分都没有文档。

目录

正文

首先是安装Pytorch,可以参照这篇:
Windows下pytorch安装
好了,现在可以开始熟悉PyTorch了。

什么是PyTorch

PyTorch 是一个基于Python的深度学习包,主要为两类人提供服务:

  1. 喜欢Numpy,却觉得他太慢的人。
  2. 目前使用的深度学习平台不够灵活。

概念基础

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’,可以获得本文的可交互代码
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!