对于一个3x3的矩阵扩充成3x3x3,有三种方式,分别为:
3x3x3
3x3x3
3x3x3
标粗的位置是插入维度的位置。以pytorch的tensor为例,假设A为一个tensor,shape为[3x3],那么这三种维度变换的方式对应的代码分别为:
A=A.squeeze(0).repeat(3, 1, 1)
A=A.squeeze(1).repeat(1, 3, 1)
A=A.squeeze(2).repeat(1, 1, 3)
这三种维度扩充方式是有本质不同。扩充的结论就是,在哪个位置上扩充,就是将原本该位置上后面维度的元素进行复制。此处给出了一些小案例,如图:
在计算损失时,往往两个矩阵维度不同。例如在目标检测中,预测了n个box,而实际标签有m个box。这时就需要把 n × q n\times q n×q的矩阵与 m × q m \times q m×q矩阵的维度对齐。对齐的方式有两种,一种是把两个矩阵都变成 n × m × q n \times m \times q n×m×q的矩阵,一种是把两个矩阵都变成 m × n × q m \times n \times q m×n×q的矩阵。可以举一个例子来说说明这个问题:
a = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = torch.tensor([[3, 2, 1], [6, 5, 4]])
#print(a*b)
a_T = a[:, None, :].repeat(1, 2, 1)
b_T = b[None, :, :].repeat(3, 1, 1)
l1 = a_T * b_T
print(l1)
a_T2 = a[None, :, :].repeat(2, 1, 1)
b_T2 = b[:, None, :].repeat(1, 3, 1)
l2 = a_T2 * b_T2
print(l2)
结果为:
tensor([[[ 3, 4, 3],
[ 6, 10, 12]],
[[12, 10, 6],
[24, 25, 24]],
[[21, 16, 9],
[42, 40, 36]]])
tensor([[[ 3, 4, 3],
[12, 10, 6],
[21, 16, 9]],
[[ 6, 10, 12],
[24, 25, 24],
[42, 40, 36]]])
可见两种矩阵对齐方式乘积结果在位置上有变换,所有相对应元素的相乘运算都相同。