目录
理解张量:
命名张量:(存疑)
张量的元素类型:
使用dtype指定数字类型:
张量的API:
张量的存储视图:
张量元数据的大小,偏移量和步长:
无复制转置 :
高维转置 :
连续张量:
理解张量:
张量(tensor)是一个数组,也就是一种数据结构,它存储了一组数字,这些数字可以用一个索引单独访问,也可以用多个索引访问。
它是一个数据容器。它包含的数据几乎总是数值数据,因此它是数字的容器。
构造1个张量:
import torch #导入import模块
a = torch.ones(3) #创建一个大小为3的一维张量,用1.0填充
张量的本质:
Python 列表或数字元组是在内存中单独分配的 Python 对象的集合,如图 3.3 左侧所示。
PyTorch 张量或 NumPy 数组通常是连续内存块的视图,这些内存块包含未装箱的 C 数字类型, 而不是 Python 对象。如图 3.3 右侧所示。
points = torch.tensor([4.0, 1.0, 5.0, 3.0, 2.0, 1.0]) print(points)
查看张量的形状:
# In:
points.shape
# Out:
torch.Size([3, 2])
使用 zeros() 或 ones() 函数来初始化张量,以元组的形式来指定大小:
# In:
points = torch.zeros(3, 2)
points
# Out:
tensor([[0., 0.],
[0., 0.],
[0., 0.]])
命名张量:(存疑)
使用 rename() 兄弟方法,可以覆盖或删除(通过传入 None )现有名称:
# In:
img_named = img_t.refine_names(..., 'channels', 'rows', 'columns')
batch_named = batch_t.refine_names(..., 'channels', 'rows', 'columns')
print("img named:", img_named.shape, img_named.names)
print("batch named:", batch_named.shape, batch_named.names)
# Out:
img named: torch.Size([3, 5, 5]) ('channels', 'rows', 'columns')
batch named: torch.Size([2, 3, 5, 5]) (None, 'channels', 'rows', 'columns')
张量的元素类型:
使用dtype指定数字类型:
torch.float32 或 torch.float : 32 位浮点数。
torch.float64 或 torch.double : 64 位双精度浮点数。
torch.float16 或 torch.half : 16 位半精度浮点数。
torch.int8 : 8 位有符号整数。
torch.uint8 : 8 位无符号整数。
torch.int16 或 torch.short : 16 位有符号整数。
torch.int32 或 torch.int : 32 位有符号整数。
torch.int64 或 torch.long : 64 位有符号整数。
torch.bool :布尔型。
张量的默认数据类型是 32 位浮点数。
张量的API:
关于张量以及张量之间的绝大多数操作(也可以称为张量对象的方法)都可以在 torch
模块中找到,如 transpose() 函数。
# In:
a = torch.ones(3, 2)
a_t = torch.transpose(a, 0, 1)
a.shape, a_t.shape
# Out:
(torch.Size([3, 2]), torch.Size([2, 3]))
对张量操作按组进行划分:
创建操作 — 用于构造张量的函数,如 ones() 和 from_numpy() 。
索引、切片、连接、转换操作 — 用于改变张量的形状、步长或内容的函数,如 transpose() 。
数学操作 — 通过运算操作张量内容的函数:
逐点操作 — 通过对每个元素分别应用一个函数来得到一个新的张量,如 abs() 和
cos() ;
归约操作 — 通过迭代张量来计算聚合值的函数,如 mean() 、 std() 和 norm() ;
比较操作 — 在张量上计算数字谓词的函数,如 equal() 和 max() ;
频谱操作 — 在频域中进行变换和操作的函数;
其他操作 — 作用于向量的特定函数(如 cross() ),或对矩阵进行操作的函数(如 trace() );
BLAS 和 LAPACK 操作 — 符合基本线性代数子程序( Basic Linear Algebra Subprogram ,
BLAS )规范的函数,用于标量、向量—向量、矩阵—向量和矩阵—矩阵操作。
随机采样 — 从概率分布中随机生成值的函数,如 randn() 和 normal() 。
序列化 — 保存和加载张量的函数,如 load() 和 save() 。
并行化 — 用于控制并行 CPU 执行的线程数的函数,如 set_num_threads() 。
张量的存储视图:
存储区是由数字数据组成的一维数组,即包含给定类型的数字的连续内存块,例如float(代表32位浮点数)或int64(代表64位整数)。一个pytorch的Tensor实例就是这样一个Storage实例的视图,该实例能够使用偏移量和每个维度的步长对该存储区进行索引。如图:
以使用 storage() 访问给定张量的存储区:
# In:
points = torch.tensor([[4.0, 1.0], [5.0, 3.0], [2.0, 1.0]])
print(points.storage())
# Out:
4.0
1.0
5.0
3.0
2.0
1.0
[torch.FloatStorage of size 6]
zero_() 方法将输入的所有元素归零,任何不带下画线的方法都不会改变源张量,而是返回一个新的张量:
# In:
a = torch.ones(3, 2)
# In:
a.zero_()
print(a)
# Out:
tensor([[0., 0.],
[0., 0.],
[0., 0.]])
张量元数据的大小,偏移量和步长:
大小(在 NumPy 中称之为形状)是一个元组,表示张量在每个维 度上有多少个元素。
偏移量是指存储区中某元素相对张量中的第 1 个元素的索引。
步长是指存储 区中为了获得下一个
元素需要跳过的元素数量。
无复制转置 :
t() 方法,它是用于二维张量转置的transpose()方法的简写:
# In:
points = torch.tensor([[4.0, 1.0], [5.0, 3.0], [2.0, 1.0]])
points
# Out:
tensor([[4., 1.],
[5., 3.],
[2., 1.]])
# In:
points_t = points.t()
points_t
# Out:
tensor([[4., 5., 2.],
[1., 3., 1.]])
高维转置 :
通过指定 2 个维度,即翻转形状和步长,来转置一个多维数组:
# In:
some_t = torch.ones(3, 4, 5)
transpose_t = some_t.transpose(0, 2)
some_t.shape
# Out:
torch.Size([3, 4, 5])
# In:
transpose_t.shape
# Out:
torch.Size([5, 4, 3])
# In:
some_t.stride()
# Out:
(20, 5, 1)
# In:
transpose_t.stride()
# Out:
(1, 5, 20)
连续张量:
利用 contiguous() 方法,我们可以通过一个非连续张量得到一个新的连续张量。张量的内容
是一样的,但是步长和存储发生了改变。