经常会在编程中遇到理解矩阵行和列的事情。
1、要明确无论这个张量有多少维度,它的矩阵乘法都只能作用于最后两个维度。
例如:
import torch
a = torch.rand([64, 32, 3, 4])
b = torch.rand([64, 32, 3, 4])
c = torch.matmul(a, b.transpose(2, 3)) # 交换b的2,3两个维度
print(c.shape)
# torch.Size([64, 32, 3, 3])
注意.dot方法只适用于两个向量的点积运算, torch.matmul是矩阵乘法运算。
2、对于张量的数学含义的理解
首先,一维张量不区分行向量和列向量,比如:
import torch
a = torch.rand([2, 3, 4]).view(-1)
print((a == a.T).all())
# tensor(True)
按照点积关系去理解,一维张量的数学含义是列向量:
import torch
a = torch.rand([2, 3]).view(-1)
b = torch.rand([6, 3])
print(torch.matmul(a, b)) # 1x6 dot 6x3
# tensor([0.8973, 1.0441, 1.3425])
print(torch.matmul(b, a)) # 6x3 dot 1x6
# RuntimeError: size mismatch, get 6, 6x3,6
但是如果不是一维变成二维,那么最底层向量的含义又变成了行向量:
import torch
a = torch.rand([1, 3])
b = torch.rand([3, 2])
print(torch.matmul(a, b))
# tensor([[0.8463, 0.9703]])
3、对于二维tensor索引的理解
和list一样,依然可以按照向下x向右y的角度理解tensor的索引关系:
4、axis和dim的理解
首先说结论,axis和dim的含义是一致的,只不过axis来自numpy, dim来自torch。调用torch.sum()方法时可以发现axis和dim参数都一样。
接着解释dim/axis的含义:为针对变量延着哪一个轴进行操作。
假设我们取张量的第一个元素进行操作,
如果dim=0,意思是让这个元素沿着x轴进行操作(向下);
如果dim=1,意思是让这个元素沿着y轴进行操作(向右);
如果dim=2,意思是让这个元素沿着z轴进行操作(向屏幕外)
。。。
import torch
a = torch.rand([2, 3, 4])
# 沿着哪个轴哪个轴就会消失
print(a.sum(dim=0).shape)
print(a.sum(dim=1).shape)
print(a.sum(dim=2).shape)
# torch.Size([3, 4])
# torch.Size([2, 4])
# torch.Size([2, 3])
常用的两个维度的操作分别是layer维度和batch维度:
layer维度也可以简单这么理解,假设一个张量一共m维,那么当dim=m-1时就表示把张量最里层的向量进行操作,然后逐步向外扩展。此时也可以写作dim=-1。
比如想要对张量进行batch维度的操作,那么就让dim=batch_size所在的维度即可。
注意这里的dim和axis只面向一个维度的处理(第一个元素只能沿着一个轴操作),如果想对图像等对两个维度同时处理需要区分开。