矩阵维度扩充的理解

1.维多扩充举例

对于一个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)

这三种维度扩充方式是有本质不同。扩充的结论就是,在哪个位置上扩充,就是将原本该位置上后面维度的元素进行复制。此处给出了一些小案例,如图:
矩阵维度扩充的理解_第1张图片

2.矩阵维度扩充在矩阵相乘中的作用

在计算损失时,往往两个矩阵维度不同。例如在目标检测中,预测了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]]])

可见两种矩阵对齐方式乘积结果在位置上有变换,所有相对应元素的相乘运算都相同。

你可能感兴趣的:(深度学习,矩阵,pytorch,python)