数学背景入门
标量
简单操作
长度--->绝对值
向量
(一行值)
简单操作
长度 每个元素的平方求和再开根号
点乘
正交
矩阵
简单操作
乘法(矩阵乘以向量)
乘法(矩阵乘以矩阵)
范数
范数(norm)是线性代数中的一个基本概念。在泛函分析中,它定义在赋范线性空间中,并满足一定的条件,即①非负性;②齐次性;③三角不等式,它常常被用来度量某个向量空间(或矩阵)中的每个向量的长度或大小。
常见范数
矩阵范数:最小的满足的上面公式的值
Frobenius范数:
特殊矩阵
对称和反对称
正定
正交矩阵
置换矩阵
特征向量和特征值
特征向量:不被矩阵改变方向的向量
对称矩阵中总能找到特征向量
线性代数的实现
标量由只有一个元素的张量表示
import torch
x=torch.tensor([3.0])
y=torch.tensor([2.0])
print(x+y)
print(x*y)
print(x/y)
print(x**y)
可以将向量视为标量值组成的列表
import torch
x=torch.arange(4)
print(x)
通过张量的索引来访问任一元素
print(x[3])
访问张量的长度
len(x)
只有一个轴的张量,形状只有一个元素
print(x.shape)
通过指定两个分量m和n来创建一个形状为m*n的矩阵
import torch
A = torch.arange(20).reshape(5,4)
print(A)
矩阵的转置
print(A.T)
对称矩阵 A等于其转置
B = torch.tensor([[1,2,3],[2,0,4],[3,4,5]])
print(B)
print(B==B.T)
就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构
X = torch.arange(24).reshape(2,3,4) # 两个三行四列的矩阵
print(X)
给定具有相同形状的任何两个张量,任何按元素二元运算的结果都将是相同形状的张量
A = torch.arange(20,dtype=torch.float32).reshape(5,4)
B = A.clone() # 通过分配新内存,将A的一个副本分配给B
print(A)
print(A+B)
两个矩阵按元素乘法称为哈达玛积
print(A*B)
a=2
X=torch.arange(24).reshape(2,3,4)
print(X)
print(a+X)
print((a*X).shape)
计算其元素的和
print(A.shape,A.sum())
x = torch.arange(4,dtype=torch.float32)
print(x)
print(x.sum())
表示任意形状张量的元素和
print(X.shape,X.sum())
指定求和汇总张量的轴
A = torch.arange(20,dtype=torch.float32).reshape(5,4)
A_sum_axis0=A.sum(axis=0)
print(A_sum_axis0,A_sum_axis0.shape)
A_sum_axis1=A.sum(axis=1)
print(A_sum_axis1,A_sum_axis1.shape)
与求和相关的量是平均值
等价于 求和/元素个数
print(A.mean())
print(A.sum()/A.numel())
print(A.mean(axis=0))
print(A.sum(axis=0)/A.shape[0])
计算总和或保持轴数不变
sum_A=A.sum(axis=1,keepdims=True) # 计算每行的总和(axis=1)
print(sum_A)
通过广播将A除以sum_A
print(A/sum_A) # sum_A 是每行的和,A/sum_A 是各元素除以每行的和
某个轴计算A元素的累计总和
print(A.cumsum(axis=0)) # 以列为轴计算累积总和
点积是相同元素的按元素乘积的和
x=torch.arange(4,dtype=torch.float32)
y=torch.ones(4,dtype=torch.float32)
print(x,y,torch.dot(x,y))
也可以通过执行按元素乘法,然后进行求和来表示两个向量的点积
print(torch.sum(x*y))
矩阵乘向量 torch.mv(A,x)
A = torch.arange(20,dtype=torch.float32).reshape(5,4)
x=torch.arange(4,dtype=torch.float32)
print(A.shape)
print(x.shape)
print(A)
print(x)
print(torch.mv(A,x))
矩阵乘矩阵 torch.mm(A,B)
A = torch.arange(20,dtype=torch.float32).reshape(5,4)
B = torch.ones(4,3)
print(torch.mm(A,B))
L2范数是向量元素平方和的平方根
u = torch.tensor([3.0,-4.0])
print(torch.norm(u))
L1范数是向量元素的绝对值之和
L1=torch.abs(u).sum()
print(L1)
矩阵的弗罗贝尼乌斯范数是矩阵元素的平方和的平方根
print(torch.ones((4,9)))
print(torch.norm(torch.ones((4,9))))
补充:按特定轴求和
axis=0 列
axis=1行
axis等于谁就把谁消掉
keepdims=True,是将对应轴设为1
import torch
a=torch.ones((2,5,4))
print(a.shape)
print(a)
a_1=a.sum(axis=1) # 消去行,只剩下两个,四列的张量
print(a_1)
print(a.sum(axis=1))
print(a.sum(axis=1).shape)
print(a.sum(axis=1,keepdims=True))
print(a.sum(axis=1,keepdims=True).shape)
问题解答:
1.为什么深度学习要用张量表示?
深度学习是机器学习的一部分,机器学习是计算机相关研究者对统计的一种理解。
2.copy和clone的区别?
clone会复制内存,copy不一定复制内存。
3.torch不区分行向量和列向量吗?
用一个二维矩阵来区分行向量和列向量。对于一个向量来说,只是一个一维数组。
4.机器学习里的张量是什么?
是一个多维数组,跟数学里的张量不一样。