动手学深度学习——矩阵

news2024/11/24 1:48:12

1. 基本概念

1.1 标量

标量由只有一个元素的张量表示。 所以标量计算与程度开发中的普通变量计算没有差异。

import torch

x = torch.tensor(3.0)
y = torch.tensor(2.0)

x + y, x * y, x / y, x**y
(tensor(5.), tensor(6.), tensor(1.5000), tensor(9.))

1.2 向量

向量泛化自标量,可以被视为标量值组成的列表,相当于把标量从零阶推广到一阶,这些标量值被称为向量的元素。

在深度学习中,使用一维张量表示向量,可以理解为一维数组。

  • 使用下标来引用向量的任一元素。
  • 向量的长度通常称为向量的维度。
  • 可以通过张量的.shape属性访问向量的长度。 形状(shape)列出了张量沿每个轴的长度(维数)。
  • 单个向量的默认方向为列向量。
x = torch.arange(4)
x
> tensor([0, 1, 2, 3])
x[3]
> tensor(3)
len(x)
> 4

x.shape
> torch.Size([4])

1.3 矩阵

矩阵将向量从一阶推广到二阶,它是一个具有两个轴的张量,数学中采用大写字母表示。

  • m行n列组成的矩阵,形状表示为(m, n), 当m=n时,则变为方阵。
A = torch.arange(20).reshape(5, 4)
A
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15],
        [16, 17, 18, 19]])

当我们交换矩阵的行和列时,结果称为矩阵的转置(transpose)。

A.T
>
tensor([[ 0,  4,  8, 12, 16],
        [ 1,  5,  9, 13, 17],
        [ 2,  6, 10, 14, 18],
        [ 3,  7, 11, 15, 19]])

方阵有一种特殊类型是对称矩阵,特点:对称矩阵的转置是矩阵本身。

B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
B
> tensor([[1, 2, 3],
        [2, 0, 4],
        [3, 4, 5]])

B == B.T
> tensor([[True, True, True],
        [True, True, True],
        [True, True, True]])

1.4 张量

向量是一阶张量,矩阵是二阶张量,但实际上张量可以表示更多阶,n阶矩阵,n个轴,n维数组。

张量在处理图像时特别有用,图像常常以n维数组形式出现, 3个轴分别对应于高度、宽度和颜色通道(channel)轴。

X = torch.arange(24).reshape(2, 3, 4)
X

>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]]])

1.5 计算基本性质

张量的运算基本是围绕元素进行计算,有以下特性:

  1. 任何按元素的一元运算都不会改变其操作数的形状。
  2. 相同形状的任意两个张量,任何按元素二元运算的结果都将是相同形状的张量。
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone()  # 通过分配新内存,将A的一个副本分配给B
# A
(tensor([[ 0.,  1.,  2.,  3.],
         [ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.],
         [12., 13., 14., 15.],
         [16., 17., 18., 19.]]),

# 一元运算: A * 2
tensor([[ 0.,  2.,  4.,  6.],
         [ 8., 10., 12., 14.],
         [16., 18., 20., 22.],
         [24., 26., 28., 30.],
         [32., 34., 36., 38.]]))
# 二元运算:A * B
tensor([[  0.,   1.,   4.,   9.],
        [ 16.,  25.,  36.,  49.],
        [ 64.,  81., 100., 121.],
        [144., 169., 196., 225.],
        [256., 289., 324., 361.]])

2. 常见计算

2.1 降维求和

降维主要用于减少数据的维度,从而降低模型的复杂度、减少计算量,并且可以帮助减少过拟合的风险。降维可以使得数据更易于处理和理解,同时可以提高模型的泛化能力。

降维的手段一般是沿着某一个轴求和,从而降低张量的维度。

如前面的二维矩阵A

# 求和前的形状: A, A.shape
(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])

沿着0轴对所有行元素求和,输入轴0的维数在输出形状中消失。

A_sum_axis0 = A.sum(axis=0)
A_sum_axis0, A_sum_axis0.shape

> (tensor([40., 45., 50., 55.]), torch.Size([4]))

如果同时给两个轴求和,则二维张量将降为一个元素的标量

A.sum(axis=[0, 1])  # 结果和A.sum()相同
> tensor(190.)

一个与求和相关的量是平均值(mean或average)。 我们通过将总和除以元素总数来计算平均值。

# 这两种计算方式结果相同
A.mean(), A.sum() / A.numel()  
> (tensor(9.5000), tensor(9.5000))

# 计算平均值的函数也可以沿指定轴降低张量的维度。
A.mean(axis=0), A.sum(axis=0) / A.shape[0]
> (tensor([ 8.,  9., 10., 11.]), tensor([ 8.,  9., 10., 11.]))

非降维求和:求和时保持维度不变,通过keepdims选项来指定。

sum_A = A.sum(axis=1, keepdims=True)
sum_A

> tensor([[ 6.],
        [22.],
        [38.],
        [54.],
        [70.]])

2.2 向量点积

定义:相同位置按元素乘积的和,常用于加权求和和加权平均的计算。

给定一组由向量x表示的值, 和一组由w表示的权重,x和w和点积可以表示为(x,w),实际上是用x的转置乘以w来进行计算。

  • 一个向量x的平方可以表示为点积(x, x)
  • 当w为非负整数且和为1时,x和w的点积可以表示加权平均。

用途1:神经网络的前向传播中,将输入特征向量与权重矩阵进行点积操作,可以得到每个神经元的加权输入,然后通过激活函数进行非线性变换,从而得到神经网络的输出。

用途2:特征提取,通过不同神经元之间的点积操作,网络可以提取出不同层次的特征信息。

计算方法之dot api:

x = torch.arange(4, dtype = torch.float32)
y = torch.ones(4, dtype = torch.float32)
x, y, torch.dot(x, y)

# 
> (tensor([0., 1., 2., 3.]), tensor([1., 1., 1., 1.]), tensor(6.))

计算方法之乘积再求和:

torch.sum(x * y)

> tensor(6.)

2.3 矩阵向量积

定义:矩阵(m,n) 和一个向量(len=n)相乘,得到一个新的向量(len=m)。

计算过程的本质:矩阵的每一行与向量进行点积运算,得到新向量的每个元素。
注意:这里的向量要当作列向量来看待。

计算方式(以前面的A矩阵和x向量为例):

A.shape, x.shape, torch.mv(A, x)

> (torch.Size([5, 4]), torch.Size([4]), tensor([ 14.,  38.,  62.,  86., 110.]))

2.4 矩阵乘法

定义: 矩阵A(m,k) 和矩阵B (k, n)相乘,得到一个新的矩阵(m, n),前提是A矩阵的列数与B矩阵的行数相等。

计算过程的本质:

  • B矩阵可以看作是n个长度为k的向量
  • AxB等价于对A矩阵进行n次矩阵向量积运算

以前面的A(5, 4) 矩阵为例,新创建一个B(4,3)矩阵, AxB将得到一个(5,3)的新矩阵。

B = torch.ones(4, 3)
torch.mm(A, B)

> tensor([[ 6.,  6.,  6.],
        [22., 22., 22.],
        [38., 38., 38.],
        [54., 54., 54.],
        [70., 70., 70.]])

2.5 范数

范数通常用于衡量向量的大小,可以帮助控制模型参数的大小以及模型的复杂度。

用途:

  • 正则化(Regularization)技术经常使用范数来约束模型的参数,以防止过拟合,提高模型的泛化能力。
  • 在损失函数中加入范数项也可以帮助优化算法更好地收敛。

L2范数记作||x||:是向量所有元素平方和的平方根,欧几里得距离就是一个L2范数。

u = torch.tensor([3.0, -4.0])
torch.norm(u)    # 用于求L2范数

> tensor(5.)

L1范数: 向量元素的绝对值之和。

torch.abs(u).sum()

> tensor(7.)

LP范数:用于对矩阵求范数,是矩阵所有元素平方和的平方根。这里以前面的A矩阵为例:

torch.norm(A)

> tensor(49.6991)

2.6 余弦夹角

范数配合点积,可以计算两个向量之间的夹角余弦值,公式如下:
在这里插入图片描述

a和b分别是两个向量,a·b表示它们的点积,||a||和||b||分别表示它们的范数(即向量的长度)。通过计算点积和范数,我们可以得到两个向量之间夹角的余弦值,进而推导出它们之间的夹角。

import torch

# 定义两个向量
a = torch.tensor([1, 2, 3], dtype=torch.float)
b = torch.tensor([4, 5, 6], dtype=torch.float)

# 计算点积
dot_product = torch.dot(a, b)

# 计算向量a和b的范数
norm_a = torch.norm(a)
norm_b = torch.norm(b)

# 计算夹角余弦值
cosine_similarity = dot_product / (norm_a * norm_b)

print("向量a: ", a)
print("向量b: ", b)
print("a和b的点积: ", dot_product)
print("a的范数:", norm_a)
print("b的范数:", norm_b)
print("夹角余弦值: ", cosine_similarity.item())
向量a:  tensor([1., 2., 3.])
向量b:  tensor([4., 5., 6.])
a和b的点积:  tensor(32.)
a的范数: tensor(3.7417)
b的范数: tensor(8.7750)
夹角余弦值:  0.9746317863464355

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1633065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端CSS基础11(相对定位,绝对定位,固定定位,粘性定位)

前端CSS基础11(相对定位,绝对定位,固定定位,粘性定位) CSS相对定位(position: relative;)相对定位的参考点在哪? CSS绝对定位(position: absolute)如何设置绝…

数据赋能(71)——数据要素:概念

从这期开始,可能讨论数据相关的更高层次的话题——数据要素。讨论数据要素目的,是为了从一个更为宏观的视野去审视数据及数据赋能。这不仅有助于我们深入理解数据的本质与潜在价值,更能为数据的充分利用与未来发展提供更广阔的视角与思路。 …

公共交通无障碍设施:科技翅膀助力盲人出行新飞跃

在城市的脉络中,公共交通扮演着连接每一个角落的重要角色。然而,对于视力受限的盲人朋友而言,这幅繁忙而复杂的交通网络往往隐藏着诸多不易察觉的障碍。值得庆幸的是,随着公共交通无障碍设施的不断完善,以及高科技辅助…

设计模式 装饰模式

文章目录 装饰模式简介装饰模式结构装饰模式代码 装饰模式简介 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向现有对象动态添加新功能,而不需要修改其现有代码,并且可以通过组合多个装饰器对象实现多种…

org.yaml.snakeyaml.scanner.ScannerException: while scanning a simple key 。。。

控制台信息: 这个信息一般是yml文件配置出现了问题,如 出现非法数据 、缩进有问题等 问题地方如下,修改一下就好了 控制台一般报的这种错就是配置文件的格式不正确

FileLink内外网文件摆渡系统产品介绍

在现代企业中,往往存在着多个网络、系统之间的数据孤岛问题,数据难以互相访问和共享。 一、常用的内外网文件摆渡方式 传统的数据交换方式往往需要人工介入,效率低下且容易出错。如:U盘、FTP、VPN等,极易引发各种各样…

算法基础课 贪心算法模板题笔记

AcWing算法基础课 贪心算法模板题笔记 贪心得到的答案 > 最优解 贪心得到的答案 < 最优解 局部最优 -> 全局最优 文章目录 1 区间问题例1&#xff1a;区间选点例2&#xff1a;最大不相交区间数量例3&#xff1a;区间分组例4&#xff1a;区间覆盖 2 Huffman树例&…

Spark SQL - 简介

目录 1. 概念介绍 2. Spark SQL与Hive的区别 3. 数据结构分类 4. 特点 4.1 易整合 4.2 统一的数据访问方式 4.3 兼容hive 4.4 提供标准的数据连接 5 Spark的数据模型介绍 1. 概念介绍 sparkSQl是spark专门针对结构化数据(DataFrame和DataSets)处理的一个组件&#xf…

FFmpeg常用结构体、关键函数、ffplay.c分析

一、常用结构体&#xff1a; 1、AVFormatContext结构体&#xff1a; AVFormatContext是一个贯穿全局的数据结构&#xff0c;很多函数都要用它作为参数。FFmpeg代码中对这个数据结构的注释是format I/O context&#xff0c;此结构包含了一个视频流的格式内容。其中存有AVIputFor…

YOLO新鲜腐烂水果检测数据集:8类,11000多张图像,标注完整

YOLO新鲜腐烂水果检测数据集&#xff1a;8类&#xff0c;11000多张图像&#xff0c;yolo标注完整&#xff0c;包含烂苹果&#xff0c;烂香蕉&#xff0c;烂橙子&#xff0c;烂石榴&#xff0c;好苹果&#xff0c;好香蕉&#xff0c;好橙子&#xff0c;好石榴8个类别 图像统一分…

2024年4月28日

2024年4月28日08:14:11 utf8和utf8mb4的区别 CRATE DATABSE USE DATABASE DROP DATABASE 2024年4月28日08:34:56 主线和支线/理论和实践 DECIMAL(P&#xff0c;D)表示列可以存储D位小数的P位数。十进制列的实际范围取决于精度和刻度。 2024年4月28日08:36:02 如何去欣赏一…

NFS服务器(linux-linux)

目录 简介 NFS背景介绍 生产应用场景 NFS工作原理 示例图 流程 NFS的使用 安装 配置文件 主配置文件分析 实验1 NFS账户映射 实验2&#xff1a; 实验3 autofs自动挂载服务 产生原因 安装 配置文件分析 实验4 实验5 简介 NFS背景介绍 NFS是一种古老的用于…

Xinstall助力手游推广,打破传统营销方式

随着移动互联网的普及&#xff0c;手游市场日益繁荣&#xff0c;手游推广方式也日新月异。在这个竞争激烈的市场中&#xff0c;如何有效地推广手游&#xff0c;吸引更多的用户&#xff0c;成为了开发者和广告主关注的焦点。而Xinstall作为国内专业的App全渠道统计服务商&#x…

这份详细的智慧校园建设方案,赶紧收藏

高等教育信息化是促进高等教育改革创新和提高质量的有效途径&#xff0c;是教育信息化发展的创新前沿。进一步加强基础设施和信息资源建设&#xff0c;重点推进信息技术与高等教育的深度融合&#xff0c;能促进教育内容、教学手段和方法现代化&#xff0c;创新人才培养、科研组…

C语言进阶|链表经典OJ题

✈移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 方法一&#xff1a; 遍历链表找到所有等于val的节点&#xff0c;再执行删除操作删除这些节点。 方法二&#xff1a; …

小程序中如何绑定会员个人信息

在小程序中&#xff0c;用户可以在个人中心页面来设置用户名、头像、手机号码和身份证号码等个人信息。以下是具体的操作步骤&#xff1a; 1. 进入个人中心->账户设置。在个人中心页面&#xff0c;点击设置按钮&#xff0c;即可进入账户设置页面。在这个页面进行账号信息设…

百万人都在求的网络安全学习路线,渗透漏洞防御总结(附图)

前言 不折腾的网络安全&#xff0c;和咸鱼有什么区别 目录 二、 前言三 、同源策略 3.1 什么是同源策略 3.2 为什么需要同源策略四 、XSS 4.1 概览 4.2 介绍 4.3 防御五 、CSRF 5.1 概览 5.2 介绍 5.3 防御六、 SQL 注入七 、流量劫持 7.1 DNS 劫持 7.2 HTTP 劫持…

某知乎APP - X-Zse-96

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识&#xff0c;欢迎私信共享学习心得。 如有侵权&#xff0c;联系博主删除。 请勿商用&#xff0c;否则后果自负。 接口网址 app 版本: 8.10.0 aHR0cHM6Ly93d3cuemhpaHUuY29tL2FwaS92NC9zZWFyY2hfdjM 加密位置分析 > …

MySQL从入门到高级 --- 3.DML基本操作

文章目录 第三章&#xff1a;3.基本操作 - DML3.1 数据插入3.2 数据修改3.3 数据删除3.4 练习 第三章&#xff1a; 3.基本操作 - DML DML&#xff1a;数据操作语言&#xff0c;用来对数据中表的数据记录进行更新 关键字&#xff1a; insert 插入 delete 删除 update 更新 …

CLIP是啥?

论文地址&#xff1a;https://arxiv.org/pdf/2103.00020v1 代码地址&#xff1a;GitHub - openai/CLIP: CLIP (Contrastive Language-Image Pretraining), Predict the most relevant text snippet given an image 题目解读 Transferable Visual model指不使用特定数据集的数…