做网站域名是什么意思,标书制作一般给多少钱,机械加工网企业名录,洛阳网站的优化张量的广播机制#xff08;Broadcasting#xff09;是一种处理不同形状张量进行数学运算的方式。通过广播机制#xff0c;PyTorch可以自动扩展较小的张量#xff0c;使其与较大的张量形状兼容#xff0c;从而进行元素级的运算。广播机制遵循以下规则#xff1a;
如果张量…张量的广播机制Broadcasting是一种处理不同形状张量进行数学运算的方式。通过广播机制PyTorch可以自动扩展较小的张量使其与较大的张量形状兼容从而进行元素级的运算。广播机制遵循以下规则
如果张量维度不相同在较小张量的形状前面加上1直到两个张量的维度相同。如果两个张量在某个维度的长度不相同但其中一个张量在该维度的长度为1那么在该维度上较小长度的张量会被扩展为较大长度。如果两个张量在任何维度上长度不同且均不为1则无法进行广播会引发错误。
广播机制的规则示例
规则1在较小张量的形状前面加1
a torch.tensor([1, 2, 3])
b torch.tensor([[1], [2], [3]])
c a b
print(c)运行结果
tensor([[2, 3, 4],[3, 4, 5],[4, 5, 6]])解释a的形状是(3,), b的形状是(3,1)。在较小的张量前面加1变成(1,3)和(3,1)然后在第0维度上广播。
规则2在某个维度的长度为1
a torch.tensor([[1, 2, 3]])
b torch.tensor([[4], [5], [6]])
c a b
print(c)运行结果
tensor([[5, 6, 7],[6, 7, 8],[7, 8, 9]])解释a的形状是(1,3), b的形状是(3,1)。a被广播到(3,3)b也被广播到(3,3)。
规则3无法广播的情况
a torch.tensor([1, 2, 3])
b torch.tensor([[1, 2], [3, 4]])
try:c a b
except RuntimeError as e:print(e)运行结果
The size of tensor a (3) must match the size of tensor b (2) at non-singleton dimension 1解释a的形状是(3,), b的形状是(2,2)它们的形状不兼容无法进行广播。
广播机制的详细示例
示例1标量与多维张量相加
a torch.tensor(5)
b torch.tensor([[1, 2, 3], [4, 5, 6]])
c a b
print(c)运行结果
tensor([[ 6, 7, 8],[ 9, 10, 11]])解释标量a被广播到与b形状匹配变成(2,3)。
示例2形状不一致但能广播
a torch.tensor([1, 2, 3])
b torch.tensor([[1], [2], [3]])
c a b
print(c)运行结果
tensor([[2, 3, 4],[3, 4, 5],[4, 5, 6]])解释a的形状是(3,), b的形状是(3,1)。a被广播到(3,3)b被广播到(3,3)。
示例3不同维度的广播
a torch.tensor([1, 2, 3])
b torch.tensor([[[1]], [[2]], [[3]]])
c a b
print(c)运行结果
tensor([[[2, 3, 4]],[[3, 4, 5]],[[4, 5, 6]]])解释a的形状是(3,)b的形状是(3,1,1)。a被广播到(3,1,3)b被广播到(3,1,3)。
示例4标量与高维张量的广播
a torch.tensor(10)
b torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
c a * b
print(c)运行结果
tensor([[[10, 20],[30, 40]],[[50, 60],[70, 80]]])解释标量a被广播到与b的形状匹配。
示例5不同形状的广播加法
a torch.tensor([[1, 2], [3, 4], [5, 6]])
b torch.tensor([10, 20])
c a b
print(c)运行结果
tensor([[11, 22],[13, 24],[15, 26]])解释a的形状是(3,2)b的形状是(2,)。b被广播到(3,2)。
张量的基本操作
示例1基本运算
a torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b torch.tensor([[[2, 2], [2, 2]], [[2, 2], [2, 2]]])
c a * b
print(c)运行结果
tensor([[[ 2, 4],[ 6, 8]],[[10, 12],[14, 16]]])解释对a和b中的每个元素进行乘法运算。
示例2列表索引
a torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b a[0]
print(b)运行结果
tensor([[1, 2],[3, 4]])解释选择张量a的第0个二维子张量。
示例3范围索引
a torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b a[:, 0, :]
print(b)运行结果
tensor([[1, 2],[5, 6]])解释选择张量a中所有的第0个二维子张量的所有元素。
示例4布尔索引
a torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b a 4
c a[b]
print(c)运行结果
tensor([5, 6, 7, 8])解释选择张量a中所有大于4的元素。
示例5多维索引
a torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b a[1, 1, 1]
print(b)运行结果
tensor(8)解释选择张量a的第二个三维子张量中的第二个二维子张量中的第二个元素。
示例6形状操作reshape
a torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b a.reshape(4, 2)
print(b)运行结果
tensor([[1, 2],[3, 4],[5, 6],[7, 8]])解释将张量a重塑为形状为(4, 2)的张量。
示例7形状操作squeeze
a torch.tensor([[[1, 2]], [[3, 4]], [[5, 6]]])
b a.squeeze()
print(b)运行结果
tensor([[1, 2],[3, 4],[5, 6]])解释删除张量a中所有为1的维度。
示例8形状操作unsqueeze
a torch.tensor([[1, 2], [3, 4], [5, 6]])
b a.unsqueeze(1)
print(b)运行结果
tensor([[[1, 2]],[[3, 4]],[[5, 6]]])解释在张量a的第一维度增加一个维度。
示例9形状操作transpose
a torch.tensor([[[1, 2, 3], [4, 5, 6]]])
b a.transpose(1, 2)
print(b)运行结果
tensor([[[1, 4],[2, 5],[3, 6]]])解释交换张量a的第1维和第2维。
示例10形状操作permute
a torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b a.permute(2, 0, 1)
print(b)运行结果
tensor([[[1, 3],[5, 7]],[[2, 4],[6, 8]]])解释根据指定的顺序重新排列张量a的维度。