import torch
x = torch.arange(16).reshape(1,4,4)
print(x)
print('--------')
a = x.sum(axis = 1,keepdim=True)
a2 = x.sum(axis = 1,keepdim=False)
a3 = x.sum(axis = 0,keepdim=True)
a4 = x.sum(axis = 0,keepdim=False)
a5 = x.sum(axis = 2,keepdim=True)
print(a)
print(a2)
print('----------')
print(a3)
print(a4)
print(a5)
import torch
x = torch.arange(16).reshape(4,4)
print(x)
print('--------')
a = x.sum(axis = 1,keepdim=True)
a2 = x.sum(axis = 1,keepdim=False)
print(a)
print(a2)
print(x/a)
结合这个两个例子,详细的讲清楚不同情况下axis轴的变化
理解PyTorch中张量的维度操作和沿特定轴的求和确实需要一点时间。让我们通过两个例子逐步解析这些操作,详细讲解不同情况下的轴变化。
import torch
x = torch.arange(16).reshape(1, 4, 4)
print(x)
print('--------')
a = x.sum(axis=1, keepdim=True)
a2 = x.sum(axis=1, keepdim=False)
a3 = x.sum(axis=0, keepdim=True)
a4 = x.sum(axis=0, keepdim=False)
a5 = x.sum(axis=2, keepdim=True)
print(a)
print(a2)
print('----------')
print(a3)
print(a4)
print(a5)
tensor([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
这是一个形状为 (1, 4, 4) 的张量。我们可以将其看作一个包含4x4矩阵的批次。
x.sum(axis=1, keepdim=True)沿轴1(即第二个维度,4的方向)求和,并保持维度。
tensor([[[24, 28, 32, 36]]])
形状变为 (1, 1, 4)。
x.sum(axis=1, keepdim=False)沿轴1求和,不保持维度。
tensor([[24, 28, 32, 36]])
形状变为 (1, 4)。
x.sum(axis=0, keepdim=True)沿轴0(即第一个维度,1的方向)求和,并保持维度。
tensor([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
因为原始张量在轴0上只有一个元素,所以结果与原始张量相同,形状为 (1, 4, 4)。
x.sum(axis=0, keepdim=False)沿轴0求和,不保持维度。
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
形状变为 (4, 4)。
x.sum(axis=2, keepdim=True)沿轴2(即第三个维度,4的方向)求和,并保持维度。
tensor([[[ 6],
[22],
[38],
[54]]])
形状变为 (1, 4, 1)。
keepdim=True 会保持被求和的维度,结果的维度数不变,只是被求和的维度大小变为1。keepdim=False 则会移除被求和的维度,结果的维度数减少1。import torch
x = torch.arange(16).reshape(4, 4)
print(x)
print('--------')
a = x.sum(axis=1, keepdim=True)
a2 = x.sum(axis=1, keepdim=False)
print(a)
print(a2)
print(x/a)
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
这是一个形状为 (4, 4) 的张量。
x.sum(axis=1, keepdim=True)沿轴1(即第二个维度,4的方向)求和,并保持维度。
tensor([[ 6],
[22],
[38],
[54]])
形状变为 (4, 1)。
x.sum(axis=1, keepdim=False)沿轴1求和,不保持维度。
tensor([ 6, 22, 38, 54])
形状变为 (4,)。
x / atensor([[0.0000, 0.1667, 0.3333, 0.5000],
[0.1818, 0.2273, 0.2727, 0.3182],
[0.2105, 0.2368, 0.2632, 0.2895],
[0.2222, 0.2407, 0.2593, 0.2778]])
这是每个元素除以其对应行的和,结果为:
tensor([[ 0/6, 1/6, 2/6, 3/6],
[ 4/22, 5/22, 6/22, 7/22],
[ 8/38, 9/38, 10/38, 11/38],
[12/54, 13/54, 14/54, 15/54]])
使用 keepdim=True 保持维度时,被求和的维度变为1。使用 keepdim=False 时,被求和的维度被移除。
为啥reshape(1, 4, 4)这种的,行反而是列了,,只有reshape(4, 4)的时候,行才是行
先回顾一下基础概念:
(4, 4)import torch
x = torch.arange(16).reshape(4, 4)
print(x)
输出:
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
这个张量的形状是 (4, 4),代表一个 4x4 的矩阵:
行是水平方向的:
[ 0, 1, 2, 3][ 4, 5, 6, 7][ 8, 9, 10, 11][12, 13, 14, 15]列是垂直方向的:
[ 0, 4, 8, 12][ 1, 5, 9, 13][ 2, 6, 10, 14][ 3, 7, 11, 15](1, 4, 4)x = torch.arange(16).reshape(1, 4, 4)
print(x)
输出:
tensor([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
这个张量的形状是 (1, 4, 4),代表一个 1x4x4 的三维张量:
1,表示批次大小。4,表示行数(每个矩阵的行)。4,表示列数(每个矩阵的列)。(4, 4):a = x.sum(axis=1, keepdim=True)
print(a)
输出:
tensor([[ 6],
[22],
[38],
[54]])
(1, 4, 4):a = x.sum(axis=1, keepdim=True)
print(a)
输出:
tensor([[[24, 28, 32, 36]]])
在 (1, 4, 4) 的三维张量中,第一维度表示的是批次大小,所以看起来每个4x4的矩阵在操作时依然是按二维的方式处理。但因为增加了一个批次维度,导致它在求和操作中表现出与二维张量不同的行为。
具体来说: