Pytorch袖珍手册之三

pytorch pocket reference

原书下载地址:
我用阿里云盘分享了「OReilly.PyTorch.Pocket.R...odels.149209000X.pdf」,你可以不限速下载
复制这段内容打开「阿里云盘」App 即可获取
链接:https://www.aliyundrive.com/s/NZvnGbTYr6C

第二章 Tensors(张量)

张量是Pytorch的基础数据结构(torch.Tensor)。其实在使用Pytorch的过程中,我们会发现张量的重要性及便捷性。
本章节中主要快速让大家了解什么是张量,它到底有什么优势,在模型构建及运算过程发挥什么作用。

什么是张量

在Pytorch里,张量就是一种数据结构(data structure),用于存储及运算的数据。就如Numpy里的数组一样,张量就是一多维数组。张量可以通过torch.Tensor类来创建标量(scalars),向量(Vectors),矩阵(Marices)及多维数组(n-dimensional arrays)。

  • 张量可以用GPU加速
  • 张量支持多进程或分布式计算
  • 张量可溯源其图计算(自动求导)

样例:CPU与GPU下张量运行

import torch

print('张量在cpu模式下运行:')
# cpu 
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = torch.tensor([[7, 8, 9], [10, 11, 12]])

z = x + y
print(z)
print(z.size())
print(z.device)

print('张量在GPU模式下运行:')
# GPU
device = 'cuda' if torch.cuda.is_available() else 'cpu'
xg = torch.tensor([[1, 2, 3], [4, 5, 6]], device=device)
yg = torch.tensor([[7, 8, 9], [10, 11, 12]], device=device)
zg = xg + yg
print(zg)
print(zg.size())
print(zg.device)

"""
张量在cpu模式下运行:
tensor([[ 8, 10, 12],
        [14, 16, 18]])
torch.Size([2, 3])
cpu
张量在GPU模式下运行:
tensor([[ 8, 10, 12],
        [14, 16, 18]], device='cuda:0')
torch.Size([2, 3])
cuda:0
"""

样例:张量在CPU与GPU间转换
tensor.to(device)
tensor.to('cpu')
tensor.to('cuda')

创建张量

  • 从已有数据创建
  • 从类数组形式的已有数据创建张量
    -- 列表,元组,标量,系列数据文件,numpy数组
  • 内置函数生成指定size的张量

样例

import numpy as np
import torch

# 列表
w = torch.tensor([1,2,3])
# 元组
w = torch.tensor((1,2,3))
# numpy
w = torch.tensor(np.array([1,2,3]))

# 通过内置函数生成,指定大小
w = torch.empty(100, 200)
w = torch.ones(100, 200)
w = torch.zeros(100, 200)

# 通过内置函数随机生成指定size的张量
w = torch.rand(100, 200)
w = torch.randn(100, 200)
w = torch.randint(100, 200)
# 指定数据类型及运行模式(cpu,gpu)
w = torch.empty((100, 200), dtype=torch.float64, device='cuda')
# 生成与原有张量同size的新张量,ones_like, _like
x = torch.empty_like(w)
tensor.png

tensor

tensor转换为numpy或list

  • torch.numpy()
  • torch.tolist()
张量的属性
  • x.dtype
    -- 数据类型
  • x.device
    -- 张量在什么设备上(GPU CPU)
  • x.shape
    -- 张量的维数
  • x.ndim
    -- 张量维数或轶
  • x.requires_grad
    -- 布尔值,是否参与自动求导运算更新
  • x.grad
    -- 存储实际梯度值
  • x.grad_fn
    -- 存储图计算函数
  • x.s_cuda, x.is_sparse, x.is_quantized, x.is_leaf, x.is_mkldnn
    -- 布尔值,张量各场景下的值
  • x.layout
    -- 张量在内存中情况
张量的数据类型

在实际应用中,对于张量的数据类型我们都是要做到可控的,不能随意混用多种类型,这样可能会造成模型不准确或不可用。
在创建张量时,可通过指定dtype参数来设置数据类型,也可以通过对已有张量进行转换得到新数据类型的张量。

  • 类似 tensor.int()
  • tensor.to(torch.int32)

Data Type

image.png

image.png

To reduce space complexity, you may sometimes want to reuse memory and overwrite tensor values using in-place operations. To perform in-place operations, append the underscore () postfix to the function name. For example, the function y.add(x) adds x to y, but the results will be stored in y.

随机生成张量

在深度学习中,对于权重初始化一般都是采用随机数,因此pytorch也提供了不少随便机生成函数。


image.png

张量操作

索引,切片,组合,分割……

直接上代码说明

import torch

x = torch.tensor([[1,2],[3,4],[5,6],[7,8]])
print(x)

# 索引
print(x[1,1])

# 返回python格式值, tensor.item()
print(x[1,1].item())

# 切片
print(x[:2, 1])

# 布尔索引
print(x[x<5])

# 转置 tensor.t(), tensor.T
print(x.t())

# 形状转换 change shape,较常用view(), reshape()比较少用。
print(x.view(2, 3))

# 组合 拼接
y = torch.stack((x, x))
print(y)

# 分割
a, b = x.unbind(dim=1)
print(a, b)
tensor operations.png

tensor operations 2

在这些操作中几处需要注意的:

  • item(),在实际应用是会经常用到的,主要用于将单个tensor值返回python数字值
  • view(),在做size转换时,大部分调用view(),而尽量少用reshape(),主要是效率以内存问题
  • x.T x.t()是在1D或2D中最快捷的转置处理,而对于更多维数据时,我们调用transpose()函数进行转置处理
  • torch.squeeze(), 在深度学习过程用于去掉不用那个维度(如4D-->3D)
  • torch.unsqueeze(),用于增加一个维度,如将一张图片变成是一个批次形式的数据格式,chw ---> bch*w

张量数学运算

在深度学习过程中,我们知道数学运算是重中之中,Pytorch也提供了很多数学计算方面的内置函数,方便在实际应用的模型搭建。

  • pointwise operations


    image.png
  • reduction funtions


    image.png

    image.png

    image.png
  • comparison calculations


    comparison.png
  • linear algebra operations


    linear algebra .png

    linear algebra 2.png
  • spectral computations


    spectral

自动微分(AutoGrad)

automatic differentiation
在Pytorch构建深度学习中一个函数是十分重要的,即backward()。它在torch.autograd包中,在基于链式法则下的梯度计算中起到关键作用。
Autograd tutorial

样例:


sum x*x.png

df/dx.png
import torch

x = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float, requires_grad=True)
print(x)
"""
tensor([[1., 2., 3.],
        [4., 5., 6.]], requires_grad=True)
"""
f = x.pow(2).sum()
print(f)
"""
tensor(91., grad_fn=)
"""
f.backward()
print(x.grad)

"""
tensor([[ 2.,  4.,  6.],
        [ 8., 10., 12.]])
"""

你可能感兴趣的:(Pytorch袖珍手册之三)