原书下载地址:
我用阿里云盘分享了「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转换为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
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也提供了不少随便机生成函数。
张量操作
索引,切片,组合,分割……
直接上代码说明
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)
在这些操作中几处需要注意的:
- 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
-
reduction funtions
-
comparison calculations
-
linear algebra operations
-
spectral computations
自动微分(AutoGrad)
automatic differentiation
在Pytorch构建深度学习中一个函数是十分重要的,即backward()。它在torch.autograd包中,在基于链式法则下的梯度计算中起到关键作用。
Autograd tutorial
样例:
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.]])
"""