深度学习基础知识(三)-线性代数的实现

1.标量使用

标量由只有一个元素的张量表示,标量可以做最简单的计算。

python 复制代码
import torch 
x=torch.tensor([3.0])
y=torch.tensor([2.0])

print(x+y)
print(x*y)
print(x/y)
print(x**y)

结果:

bash 复制代码
tensor([5.])
tensor([6.])
tensor([1.5000])
tensor([9.])

2.向量使用

向量:将标量值组成的列表就是向量

python 复制代码
x=torch.arange(4)
print(x)
# 取向量中的元素
print(x[3])

结果:

bash 复制代码
tensor([0, 1, 2, 3])
tensor(3)

访问张量的长度

python 复制代码
print(len(x))
# 结果为4

只有一个轴的张量,形状只有一个元素

python 复制代码
print(x.shape)
# 结果为:torch.Size([4])

创建一个二维矩阵5行4列,然后将矩阵做转置,轴对称的一个转置

python 复制代码
a=torch.arange(20).reshape(5,4)
print(a)

# 矩阵的转置
print(a.T)

结果:其实就是把每一列转换成行

bash 复制代码
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15],
        [16, 17, 18, 19]])
tensor([[ 0,  4,  8, 12, 16],
        [ 1,  5,  9, 13, 17],
        [ 2,  6, 10, 14, 18],
        [ 3,  7, 11, 15, 19]])

3.矩阵使用

对称矩阵:它的转置等于自己,你可以注意数据里数值,就可以明白为什么是对称的了

python 复制代码
b=torch.tensor([[1,2,3],[2,0,4],[3,4,5]])
print(b)
print("b的转置:",b.T)
print("转置后元素是否相等:",b==b.T)

结果:

bash 复制代码
tensor([[1, 2, 3],
        [2, 0, 4],
        [3, 4, 5]])
b的转置: tensor([[1, 2, 3],
        [2, 0, 4],
        [3, 4, 5]])
转置后元素是否相等: tensor([[True, True, True],
        [True, True, True],
        [True, True, True]])

就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构。

python 复制代码
x=torch.arange(24).reshape(2,3,4)
print(x)

结果:分别有两个二维,三行,四列的维度

bash 复制代码
tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]])

两个矩阵按元素乘法称为哈达玛积(数学符号⊙)。

python 复制代码
a=torch.arange(20).reshape(5,4)
b=a.clone()# 重新分配内存,将A的副本分配给b
print("a:",a)
print("b:",b)

# 按元素乘法,哈达玛积
print("哈达玛积:",a*b)

# 也可以标量乘以或与矩阵相加
h=2
x=torch.arange(24).reshape(2,3,4)
print("h+x:",h+x)
print("x*a.shape:",(h*x).shape)

结果:

bash 复制代码
a: tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15],
        [16, 17, 18, 19]])
b: tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15],
        [16, 17, 18, 19]])
哈达玛积: tensor([[  0,   1,   4,   9],
        [ 16,  25,  36,  49],
        [ 64,  81, 100, 121],
        [144, 169, 196, 225],
        [256, 289, 324, 361]])
h+x: tensor([[[ 2,  3,  4,  5],
         [ 6,  7,  8,  9],
         [10, 11, 12, 13]],

        [[14, 15, 16, 17],
         [18, 19, 20, 21],
         [22, 23, 24, 25]]])
x*a.shape: torch.Size([2, 3, 4])

指定求和汇总张量的轴

python 复制代码
# 按维度的列求和
a_sumaxis0=a.sum(axis=0)
print(a_sumaxis0)

# 按维度的行求和
a_sumaxis1=a.sum(axis=1)
print(a_sumaxis1)

结果:

bash 复制代码
a原来的值: tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15],
        [16, 17, 18, 19]])

tensor([40, 45, 50, 55])  # 按列求的和
tensor([ 6, 22, 38, 54, 70]) # 按行求的和

一个与求和相关的量是平均值(mean或average),也可以指定按某个维度处理

bash 复制代码
print(a.sum())
# 满足条件的元素个数
print(a.numel())

# 求平均值,也等于a.mean()
print(a.sum()/a.numel())

# 按维度进行求平均值
print(a.mean(axis=0,dtype=torch.float32))
# 与上一个结果相等,方式不同
print(a.sum(axis=0)/ a.shape[0])

结果:

bash 复制代码
tensor(190)
20
tensor(9.5000)
tensor([ 8.,  9., 10., 11.])
tensor([ 8.,  9., 10., 11.])

计算总和和均值时保持轴数不变

python 复制代码
# 按行求和
sum_a=a.sum(axis=1,keepdims=True)
print(sum_a)
print(a)

# 通过广播将a/sum_a
print(a/sum_a)

某个轴计算a元素的累积总和

python 复制代码
print(a.cumsum(axis=0))

结果:

bash 复制代码
tensor([[ 0,  1,  2,  3],
        [ 4,  6,  8, 10],
        [12, 15, 18, 21],
        [24, 28, 32, 36],
        [40, 45, 50, 55]])

点积:只能支持两个一维向量,是相同位置的按元素乘积的和

python 复制代码
y=torch.ones(4,dtype=torch.float32)
x=torch.arange(4,dtype=torch.float32)
print(y)

print(x)

# 点积也等价于torch.sum(x*y)
print(torch.dot(x,y))

结果:

bash 复制代码
tensor([1., 1., 1., 1.])
tensor([0., 1., 2., 3.])
tensor(6.)

矩阵向量乘法:只支持矩阵向量乘法,如果input为 n × m n\times m n×m的,vec向量的长度为m,那么输出为 n × 1的向量。

python 复制代码
from numpy.core.multiarray import dtype
print(a)
print(a.shape)
x=torch.arange(4)
print(x)
print(x.shape)
# 矩阵向量乘法,
print(torch.mv(a,x))

结果:

bash 复制代码
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15],
        [16, 17, 18, 19]])
torch.Size([5, 4])
tensor([0, 1, 2, 3])
torch.Size([4])
tensor([ 14,  38,  62,  86, 110])

两个矩阵做乘法:对矩阵input 和mat2进行相乘。 如果input 是一个n×m张量,mat2 是一个 m×p张量,将会输出一个 n×p张量out。
torch.mm()不支持广播机制

python 复制代码
mat1=torch.arange(12).reshape(3,4)
mat2=torch.arange(12).reshape(4,3)
print(mat1)
print(mat2)
print(torch.mm(mat1,mat2))

结果:

bash 复制代码
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
tensor([[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]])
tensor([[ 42,  48,  54],
        [114, 136, 158],
        [186, 224, 262]])

L2范数:是向量元素平方和的平方根。

bash 复制代码
u=torch.tensor([3.0,-4.0])
print(torch.norm(u))

结果:

bash 复制代码
tensor(5.)

L1范数:表示为向量元素的绝对值之和:

python 复制代码
u=torch.tensor([3.0,-4.0])
print(torch.norm(u))

结果:

bash 复制代码
tensor(7.)

f范数矩阵:是矩阵元素的平方和的平方根。

python 复制代码
print(torch.norm(torch.ones(4,9)))
#结果为:tensor(6.)

李沐老师的深度学习课学习笔记内容!希望对你有帮助

相关推荐
AI蜗牛之家3 小时前
Qwen系列之Qwen3解读:最强开源模型的细节拆解
人工智能·python
王上上3 小时前
【论文阅读30】Bi-LSTM(2024)
论文阅读·人工智能·lstm
殇者知忧3 小时前
【论文笔记】若干矿井粉尘检测算法概述
深度学习·神经网络·算法·随机森林·机器学习·支持向量机·计算机视觉
YunTM4 小时前
贝叶斯优化+LSTM+时序预测=Nature子刊!
人工智能·机器学习
舒一笑5 小时前
智能体革命:企业如何构建自主决策的AI代理?
人工智能
丁先生qaq6 小时前
热成像实例分割电力设备数据集(3类,838张)
人工智能·计算机视觉·目标跟踪·数据集
红衣小蛇妖6 小时前
神经网络-Day45
人工智能·深度学习·神经网络
JoannaJuanCV7 小时前
BEV和OCC学习-5:数据预处理流程
深度学习·目标检测·3d·occ·bev
KKKlucifer7 小时前
当AI遇上防火墙:新一代智能安全解决方案全景解析
人工智能
DisonTangor7 小时前
【小红书拥抱开源】小红书开源大规模混合专家模型——dots.llm1
人工智能·计算机视觉·开源·aigc