本系列文章配套代码获取有以下两种途径:
-
通过百度网盘获取:
链接: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()
命名张量:
工厂函数可以使用names参数,为每个维度关联一个名称,该参数是一个字符串序列。
使用 names 属性访问张量的维度名称,使用 rename() 函数重命名已命名的维度。
>>> imgs = torch.randn(1, 2, 2, 3 , 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(1, 2, 2, 3 , 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(32, 3, 128, 128)
>>> named_imgs = imgs.refine_names('N', 'C', 'H', 'W')
>>> named_imgs.names
('N', 'C', 'H', 'W')
# 使用省略号(...)来匹配任意维度
>>> tensor = torch.randn(2, 3, 5, 7, 11)
>>> tensor = tensor.refine_names('A', ..., 'B', 'C')
>>> tensor.names
('A', None, None, 'B', 'C')
名称推断:
命名张量使用名称来自动检查 API 在运行时是否被正确调用,这一过程称为名称推断。名称推断包括以下两个步骤:
-
检查名称:运算可在运行时执行自动检查,检查某些维度名称是否必须匹配。如果两个名称相等(字符串相等)或者至少有一个名称为 None,则它们匹配。因为, None 本质上是一个特殊的“通配符”名称。
-
传播名称:名称推断会将名称传播到输出张量。如果 dim 或 dims 指定的输入张量的维数不存在于输出张量中,那么这些维数的相应名称不会出现在 output.names 中。
>>> x = torch.randn(1, 3, 3, 3, names=('N', 'C', 'H', 'W'))
>>> x.squeeze('N').names
('C', 'H', 'W')
>>> x = torch.randn(3, 3, 3, 3, names=('N', 'C', 'H', 'W'))
>>> x.sum(['N', 'C']).names
('H', 'W')
>>> x = torch.randn(3, 3, 3, 3, names=('N', 'C', 'H', 'W'))
>>> x.sum(['N', 'C'], keepdim=True).names
('N', 'C', 'H', 'W')
数学运算:
>>> x = torch.randn(3, 3, names=('N', None))
>>> y = torch.randn(3, 3, names=(None, 'C'))
>>> (x + y).names
('N', 'C')
>>> x = torch.randn(3, 3)
>>> y = torch.randn(3, 3, names=('N', 'C'))
>>> (x + y).names
('N', 'C')
维度变换操作:
>>> x = torch.randn(3, 3, names=('N', 'C'))
>>> x.transpose('N', 'C').names
('C', 'N')
矩阵乘积:
当两个张量进行矩阵乘法时,收缩的维度消失并且不会出现在输出张量中。
>>> x = torch.randn(3, 3, names=('N', 'D'))
>>> y = torch.randn(3, 3, 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(3, 3, 3, 3, names=('A', 'B', 'C', 'D'))
>>> y = torch.randn(3, 3, 3, names=('B', 'E', 'F'))
>>> torch.matmul(x, y).names
('A', 'B', 'C', 'F')
按名称显式对齐:
使用align_as() 或align_to() 将张量维度按名称对齐到指定的顺序。这对于执行“按名称广播”很有用。
-
align_to():
使用align_to() 排列大量维度时可以使用省略号(…)来匹配任意维度,而无需按照permute() 的要求提及所有维度。
>>> tensor = torch.randn(1, 2, 3, 4, 5, 6)
>>> named_tensor = tensor.refine_names('A', 'B', 'C', 'D', 'E', 'F')
# permute()函数不支持命名张量
>>> tensor.permute(5, 4, 0, 1, 2, 3).shape
torch.Size([6, 5, 1, 2, 3, 4])
# 使用省略号(...)来匹配任意维度
>>> named_tensor.align_to('F', 'E', ...).names
('F', 'E', 'A', 'B', 'C', 'D')
-
align_as():
>>> x = torch.randn(127, 128, names=('W', 'H'))
>>> y = torch.randn(32, 128, 127, 3, names=('N', 'H', 'W', 'C'))
>>> x.align_as(y).names
('N', 'H', 'W', 'C')
>>> x.align_as(y).shape
torch.Size([1, 128, 127, 1])
更多内容可以前往官网查看:
https://pytorch.org/
本篇文章来源于微信公众号: 码农设计师