目录

理解张量:

 命名张量:(存疑)

 张量的元素类型:

使用dtype指定数字类型:

张量的API:

 张量的存储视图:

 张量元数据的大小,偏移量和步长:

 无复制转置 :

高维转置 :

连续张量:


理解张量:

张量(tensor)是一个数组,也就是一种数据结构,它存储了一组数字,这些数字可以用一个索引单独访问,也可以用多个索引访问。

它是一个数据容器。它包含的数据几乎总是数值数据,因此它是数字的容器。

构造1个张量:

import torch   #导入import模块
a = torch.ones(3)   #创建一个大小为3的一维张量,用1.0填充

张量的本质:

Python 列表或数字元组是在内存中单独分配的 Python 对象的集合,如图 3.3 左侧所示。

PyTorch 张量或 NumPy 数组通常是连续内存块的视图,这些内存块包含未装箱的 C 数字类型, 而不是 Python 对象。如图 3.3 右侧所示。

Python 向量转张量 python中张量_pytorch

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实例的视图,该实例能够使用偏移量和每个维度的步长对该存储区进行索引。如图:

 

Python 向量转张量 python中张量_人工智能_02


以使用 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 个元素的索引。

步长是指存储 区中为了获得下一个

元素需要跳过的元素数量。


Python 向量转张量 python中张量_深度学习_03

无复制转置 :


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() 方法,我们可以通过一个非连续张量得到一个新的连续张量。张量的内容



是一样的,但是步长和存储发生了改变。