【研究生随笔】Pytorch中的线性代数
- 在许多科研项目中,都会涉及到大量的数学公式的转换和计算,包括求导、微积分等。在pytorch中的autograd可以自动计算微分。
- 创建矩阵或者向量时,若元素值都一样的话,可以使用torch.zeros( , , )来实现(案例为全零)。
- Torch.exp(X):表示eX 其中X貌似为tensor类型(张量)。
- Torch.cat(X,Y,dim)表示将两个张量按一定规则进行连接:
X = torch.arange(12, dtype=torch.float32).reshape((3, 4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)
其中,dim = 0为Y轴连接,dim = 1为X轴连接。
- 假设,A = tensor([[0], [1], [2]]) B = tensor([[0 ,1]])
在张量计算过程中,A和B虽然shape不同,但也是可以相加的,他们会按照彼此所希望的样子各自对自己做出改变,一起组合成更加强大的“我们”。如下:
A会变成A = tensor([[0,0], [1,1], [2,2]]),B会变成B = tensor([[0 ,1], [0 ,1], [0 ,1]])
从而两者组合为A + B = tensor([[0, 1], [1, 2], [2, 3]])
###############################################################################
标题对元素的索引或其他操作与数组类似
- 矩阵或向量的转置:A.T即可(注意对称阵等特殊矩阵)
- 图像以n维数组形式出现,其中3个轴对应于⾼度、宽度,以及⼀个通道(channel)轴,⽤于堆叠颜⾊通道(红⾊、绿⾊和蓝⾊)。
标题张量的降维
在数学中,要对矩阵中的元素进行求和,需要使用到∑,代码里可以直接用求和函数sum():
X = torch. Tensor([[1,2,3],[1,2,3]])
Xsum = X.sum()
调用求和函数其实是对张量进行降维成一个一维标量来进行求和,还可以在sum()中添加函数来指定需要按哪个轴来进行降维(axis = 0为Y轴,axis = 1为X轴)。
是不是可以用来计算各行或者各列上的总和呢?
当添加参数后,sum(axis = 0)所输出的便不再是一个总和值,而是一个降维后的标量。
是不是不太好理解,就比方说:A = [[1,2,3], [1,2,3]]:
当对A.sum(axis = 1)时,其输出变为[[6],[6]];而当对A.sum(axis = 0)时,其输出变为[[2,4,6]]。
还可以这样:A.sum(axis = [0,1]) ---------- 意思是沿着行和列对矩阵元素进行求和,最后得出的效果与A.sum()相同(就是普通求和)
如果不想进行降维求和,那就可以使用cumsum()函数,具体如下:
import torch as torch
A torch.tensor(
[1,2,3],
[1,2,3],
[1,2,3]]
print("original A is ",[A})
print("chuange to e is:",[A.sum(axis 0)})
print("chuange to 1 is:"[A.sum(axis 1)))
print("cumsum e is:",[A.cumsum(axis e)))
print("cumsum 1 is:",{A.cumsum(axis 1)})
输出如下:
original A is {tensor([[1,2,3],
[1,2,3],
[1,2,3])}
chuange to e is:{tensor([3,6,9])}
chuange to 1 is:{tensor([6,6,6])}
cumsum e is:{tensor([[1,2,3],
[2,4,6],
[3,6,9]])}
cumsum
1is:{tensor([1,3,6],
[1,3,6]
[1,3,6]])
计算元素的平均值也有函数可以调用:A.mean() 其效果同:A.sum() / A.numel()。该函数跟sum()一样,可以加参数实现不同轴的降维。也就是说,可以通过axis参数的控制,实现对各行各列的平均值计算。
- 点积(A的转置乘以B)torch.dot(A,B),按照点积的定义,也可以使用这个来实现:sum(A * B)(先相乘后求和),其中A * B又叫A和B的哈达玛积(元素之间的乘法)。
- • 向量积(矩阵与向量之积,注意矩阵和向量形状的约束)可以使⽤向量积来描述在给定前⼀层的值时,求解神经⽹络每⼀层所需的复杂计算。Torch.mv(A,x)
- • 矩阵乘法(前行乘后列):有点想法,每一次都是进行的行乘列,然后相乘元素求和,那么就可以转换成一个递归问题,通过向量积和求和来完成每一个子问题的过程。Torch.mm(A , B)
- 范数:
L2范数是向量元素平方和的平方根:Torch.norm(A) 。 在实际应用中,更多的是使用到L2范数的平方,那就再自乘一下就好了。
L1范数是向量元素绝对值之和:torch.abs(A).sum()。
对于矩阵的范数叫做弗罗⻉尼乌斯范数,跟L2范数是类似的。
###########################################################################
(待续)