首页人工智能Pytorch【深度学习(PyTorch...

【深度学习(PyTorch篇)】15.命名张量

本系列文章配套代码获取有以下两种途径:

  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1XuxKa9_G00NznvSK0cr5qw?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/PyTorch





命名张量(Named Tensor)是Pytorch提供的一个功能,允许用户为张量的每个维度指定一个名称。旨在通过允许用户将显式名称与张量的维度相关联,使张量的操作更为直观和易于理解。

在大多数情况下,采用维度参数的操作都会接受维度名称,从而避免了按位置跟踪维度的需要。此外,命名张量使用名称在运行时自动检查应用程序接口的使用是否正确,从而提供额外的安全性。名称还可用于重新排列维度,例如,支持 “按名称广播 “而非 “按位置广播”。
以下工厂函数支持命名张量:
  • torch.empty()
  • torch.rand()
  • torch.randn()
  • torch.ones()
  • torch.tensor()
  • torch.zeros()
需要注意的是,命名张量API是实验性功能,后续可能会发生变化。在发布稳定版之前,请勿将其用于重要用途。
01

命名张量:


工厂函数可以使用names参数,为每个维度关联一个名称,该参数是一个字符串序列。

使用 names 属性访问张量的维度名称,使用 rename() 函数重命名已命名的维度。

>>> imgs = torch.randn(1223 , names=('N''C''H''W'))
>>> imgs.names
('N''C''H''W')
>>> renamed_imgs = imgs.rename(H='height', W='width')

# 重命名已命名的维度
>>> renamed_imgs.names
('N''C''height''width')

命名张量不需要命名所有维度,不需要命名的维度可以使用None表示

>>> imgs = torch.randn(1223 , names=(None, 'C''H''W'))
>>> imgs.names
(None, 'C''H''W')

通过rename() 函数还可以修改或删除(传入None)张量现有的维度名称。

# 修改部分维度的名称
>>> renamed_imgs = imgs.rename(H='height',W='width')
>>> renamed_imgs.names
(None, 'C''height''width')

# 删除(传入None)张量现有的维度名称
>>> renamed_imgs = imgs.rename(None,None,'height','width')
>>> renamed_imgs.names
(None, None, 'height''width')

如果需要对一个张量未命名的维度命名但不改变其他维度的名称时,可以调用refine_names()函数实现。与索引操作类似,可以使用省略号()来匹配任意维度。

>>> imgs = torch.randn(323128128)
>>> named_imgs = imgs.refine_names('N''C''H''W')
>>> named_imgs.names
('N''C''H''W')

# 使用省略号(...)来匹配任意维度
>>> tensor = torch.randn(235711)
>>> tensor = tensor.refine_names('A', ..., 'B''C')
>>> tensor.names
('A', None, None, 'B''C')


02

名称推断:


命名张量使用名称来自动检查 API 在运行时是否被正确调用这一过程称为名称推断。名称推断包括以下两个步骤:

  • 检查名称:运算可在运行时执行自动检查,检查某些维度名称是否必须匹配。如果两个名称相等(字符串相等)或者至少有一个名称为 None,则它们匹配。因为, None 本质上是一个特殊的“通配符”名称。

  • 传播名称:名称推断会将名称传播到输出张量。如果 dim 或 dims 指定的输入张量的维数不存在于输出张量中,那么这些维数的相应名称不会出现在 output.names 中。

所有支持命名张量的操作都会传播名称,例如:
删除维度操作:
>>> x = torch.randn(1333, names=('N''C''H''W'))
>>> x.squeeze('N').names
('C''H''W')

>>> x = torch.randn(3333, names=('N''C''H''W'))
>>> x.sum(['N''C']).names
('H''W')

>>> x = torch.randn(3333, names=('N''C''H''W'))
>>> x.sum(['N''C'], keepdim=True).names
('N''C''H''W')

数学运算:

>>> x = torch.randn(33, names=('N', None))
>>> y = torch.randn(33, names=(None, 'C'))
>>> (x + y).names
('N''C')

>>> x = torch.randn(33)
>>> y = torch.randn(33, names=('N''C'))
>>> (x + y).names
('N''C')

维度变换操作:

>>> x = torch.randn(33, names=('N''C'))
>>> x.transpose('N''C').names
('C''N')

矩阵乘积:

当两个张量进行矩阵乘法时,收缩的维度消失并且不会出现在输出张量中。

>>> x = torch.randn(33, names=('N''D'))
>>> y = torch.randn(33, names=('in''out'))
>>> x.mm(y).names
('N''out')

# 对于 dim >= 2 的 tensor 来说最后两维被看作矩阵的行和列,其余(如果存在)被看作 batch。
# 'A', 'B'为batch,因此相当于Tensor['C', 'D'] @ Tensor['E', 'F'] = Tensor['C', 'F']
>>> x = torch.randn(3333, names=('A''B''C''D'))
>>> y = torch.randn(333, names=('B''E''F'))
>>> torch.matmul(x, y).names
('A''B''C''F')

03

按名称显式对齐:


使用align_as()align_to() 将张量维度按名称对齐到指定的顺序。这对于执行“按名称广播”很有用。

  • align_to():

使用align_to() 排列大量维度时可以使用省略号()来匹配任意维度,而无需按照permute() 的要求提及所有维度。

>>> tensor = torch.randn(123456)
>>> named_tensor = tensor.refine_names('A''B''C''D''E''F')

# permute()函数不支持命名张量
>>> tensor.permute(540123).shape
torch.Size([651234])

# 使用省略号(...)来匹配任意维度
>>> named_tensor.align_to('F''E', ...).names
('F''E''A''B''C''D')
  • align_as()
排列自身张量的维度以匹配另一个张量中的维度顺序,为新名称添加大小为1的度。
>>> x = torch.randn(127128, names=('W''H'))
>>> y = torch.randn(321281273, names=('N''H''W''C'))

>>> x.align_as(y).names
('N''H''W''C')

>>> x.align_as(y).shape
torch.Size([11281271])

更多内容可以前往官网查看

https://pytorch.org/


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments