【05 线性代数】动手学深度学习

数学背景入门

标量

简单操作

长度--->绝对值

向量

(一行值)

简单操作

长度 每个元素的平方求和再开根号

点乘

正交

矩阵

简单操作

乘法(矩阵乘以向量)

乘法(矩阵乘以矩阵)

范数

范数(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.机器学习里的张量是什么?

是一个多维数组,跟数学里的张量不一样。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值