赞
踩
张量的广播机制(Broadcasting)是一种处理不同形状张量进行数学运算的方式。通过广播机制,PyTorch可以自动扩展较小的张量,使其与较大的张量形状兼容,从而进行元素级的运算。广播机制遵循以下规则:
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维度上广播。
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)。
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),它们的形状不兼容,无法进行广播。
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)。
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)。
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)。
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
的形状匹配。
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)。
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
中的每个元素进行乘法运算。
a = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b = a[0]
print(b)
运行结果:
tensor([[1, 2],
[3, 4]])
解释:选择张量a
的第0个二维子张量。
a = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b = a[:, 0, :]
print(b)
运行结果:
tensor([[1, 2],
[5, 6]])
解释:选择张量a
中所有的第0个二维子张量的所有元素。
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的元素。
a = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b = a[1, 1, 1]
print(b)
运行结果:
tensor(8)
解释:选择张量a
的第二个三维子张量中的第二个二维子张量中的第二个元素。
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)的张量。
a = torch.tensor([[[1, 2]], [[3, 4]], [[5, 6]]])
b = a.squeeze()
print(b)
运行结果:
tensor([[1, 2],
[3, 4],
[5, 6]])
解释:删除张量a
中所有为1的维度。
a = torch.tensor([[1, 2], [3, 4], [5, 6]])
b = a.unsqueeze(1)
print(b)
运行结果:
tensor([[[1, 2]],
[[3, 4]],
[[5, 6]]])
解释:在张量a
的第一维度增加一个维度。
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维。
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
的维度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。