张量命名是一个非常有用的方法,这样可以方便地使用维度的名字来做索引或其他操作,大大提高了可读性、易用性,防止出错。
命名的对象是张量的维度:
NCHW = [‘N’, ‘C’, ‘H’, ‘W’]
#张量命名
images = torch.randn(32, 3, 56, 56, names=NCHW)
images.sum('C')
images.select('C', index=0)
# 也可以这么设置
tensor = torch.rand(3,4,1,2,names=('C', 'N', 'H', 'W'))
# 使用align_to可以对维度方便地排序
tensor = tensor.align_to('N', 'C', 'H', 'W')
命名张量允许用户为张量维度指定明确的名称。在大多数情况下,采用维度参数的操作将接受维度名称,从而无需按位置跟踪维度。此外,命名张量使用名称来自动检查 API 在运行时是否被正确使用,从而提供额外的安全性。名称还可用于重新排列维度,例如,支持“按名称广播”而不是“按位置广播”。
使用方法:对于任意张量,采用一个 names
参数,参数值是一个字符类型列表or元组,值表示维度名称,将名称与每个维度相关联。
>>> torch.zeros(2, 3, names=('N', 'C')) tensor([[0., 0., 0.], [0., 0., 0.]], names=('N', 'C')) <!-- wp:preformatted --> <pre id="codecell0" class="wp-block-preformatted">>>> <strong>torch.zeros(</strong>2<strong>,</strong> 3<strong>,</strong> <strong>names=(</strong>'N'<strong>,</strong> 'C'<strong>))</strong> tensor([[0., 0., 0.], [0., 0., 0.]], names=('N', 'C')) #获得维度的名称为i的tensor tensor.names[i]#获得为维度的名称i的tensor
以下函数支持命名张量:
使用tensor.names
访问张量的维度名称和 tensor.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)
命名张量可以与未命名张量共存;命名张量是 的实例 torch.Tensor
。未命名张量具有命名None
维度。命名张量不需要命名所有维度。
>>> imgs = torch.randn(1, 2, 2, 3 , names=(None, 'C', 'H', 'W')) >>> imgs.names (None, 'C', 'H', 'W')
名称传播语义
命名张量使用名称来自动检查 API 在运行时是否被正确调用。这发生在一个名为name inference的过程中。更正式地说,名称推断包括以下两个步骤:
- 检查名称:操作员可以在运行时执行自动检查,以检查某些维度名称是否必须匹配。
- 传播名称:名称推断将名称传播到输出张量。
所有支持命名张量的操作都会传播名称。
>>> x = torch.randn(3, 3, names=('N', 'C')) >>> x.abs().names ('N', 'C')