动手学深度学习——矩阵

1. 基本概念

1.1 标量

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

import torchx = 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)
> 4x.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表示的权重,当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.mzph.cn/web/3500.shtml

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

相关文章

【C++】316 去除重复字母

给你一个字符串 s &#xff0c;请你去除字符串中重复的字母&#xff0c;使得每个字母只出现一次。需保证 返回结果的 字典序 最小&#xff08;要求不能打乱其他字符的相对位置&#xff09; #include <string> #include <stack> #include <unordered_map>usi…

IDEA 中如何通过连接数据库自动生成代码

目录 1、IDEA 中安装 MyBatisX 插件 2、点击 IDEA 右侧的 database 数据库按钮&#xff0c;点击新建数据源 Data Source 3、编辑数据库连接信息 4、选择你要生成代码的数据库表 5、编辑你代码生成的基本路径以及一些配置项 6、选择annotation&#xff1a;mybatis-plus3&a…

华为数字化转型与数据管理实践介绍(附PPT下载)

华为作为全球领先的信息与通信技术&#xff08;ICT&#xff09;解决方案提供商&#xff0c;在数字化转型和数据管理领域拥有丰富的实践经验和技术积累。其数字化转型解决方案旨在帮助企业通过采用最新的ICT技术&#xff0c;实现业务流程、组织结构和文化的全面数字化&#xff0…

SpringBoot+RabbitMQ实现MQTT协议通讯

一、简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上&#xff0c;是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议&#xff0c;为此&#xff0c;它需要一个消息中间件 。此…

Android在AMS中拦截某个Activity的启动

文章目录 Android在AMS中拦截某个具体Activity的启动方案一&#xff08;推荐&#xff09;&#xff1a;在ActivityTaskManagerService.startActivityAsUser方法中去作拦截方案二&#xff1a;在Dialog.show()方法中直接对这个包名所创建的Dialog做限制 Android在AMS中拦截某个具体…

@Slf4j vs LoggerFactory.getLogger(): 日志记录方式的对比与选择

前言 在Java开发中&#xff0c;日志记录是追踪系统行为、诊断问题和监控应用性能的关键工具。SLF4J&#xff08;Simple Logging Facade for Java&#xff09;作为一款流行的日志门面库&#xff0c;提供了统一的日志API&#xff0c;允许开发者灵活地对接多种底层日志实现。本文…

一文解读:阿里云 AI 基础设施的演进与挑战

云布道师 2024 年 4 月 18-19 日&#xff0c;2024 中国生成式 AI 大会在北京 JW 万豪酒店举行&#xff0c;阿里云高级技术专家、阿里云异构计算 AI 推理团队负责人李鹏受邀在【AI Infra】专场发表题为《AI 基础设施的演进与挑战》的主题演讲。李鹏从 AIGC 对云基础设施的挑战、…

HarmonyOS hsp制作与引用

1. HarmonyOS hsp制作与引用 1.1 介绍 HSP动态共享包&#xff08;模块&#xff09;,应用内HSP指的是专门为某一应用开发的HSP&#xff0c;只能被该应用内部其他HAP/HSP使用&#xff0c;用于应用内部代码、资源的共享。应用内HSP跟随其宿主应用的APP包一起发布&#xff0c;与该…

react —— useState 深入

基础用法 useState Hook 提供了这两个功能&#xff1a; State 变量 在第一次重新渲染期间&#xff0c;这将具有作为参数传递的值State setter 函数 set 函数将允许将状态的值更新为不同的值&#xff0c;如果 set 函数中提供的值不同&#xff0c;则将触发重新渲染。 注意&…

MyBatis基础操作

黑马程序员JavaWeb开发教程 文章目录 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求&#xff0c;完成员工管理的需求开发一、环境准备1、准备数据库表emp2、创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动、lombok&…

【树莓派4B】如何点亮树莓派的LED灯

在之前一系列文章中&#xff0c;使用python、行人入侵检测&#xff0c;确没有使用树莓派的硬件。控制引脚进行输出&#xff1a; 如何写python点亮led灯闪烁&#xff0c;我灯接在gpio13,GPIO19,gpio26。我都想闪烁。 你可以使用Python的GPIO库来控制树莓派上的LED灯。首先&…

Linux 安装 nvm,并使用 Jenkins 打包前端

文章目录 nvm是什么nvm下载nvm安装设置 nvm 环境变量设置 Jenkins 打包命令 nvm是什么 nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和n都是node.js版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它可以安装…

数仓开发LAG 和 LEAD 函数详细解析和用例

在做Iot大数据开发时&#xff0c;需要用到lag和lead函数来计算设备故障。下面详细解析lag和lead函数的作用和例子。 LAG 和 LEAD 函数是用于在 Spark SQL 中进行窗口函数操作时常用的两个函数&#xff0c;它们用于获取某一行在分组内的前一行或后一行的数值。下面详细解释它们…

element-ui el-tabs el-tab-pane 的使用

实现效果&#xff1a;1、去掉它的下划线 2、标签切换的蓝色线条 3、字体&#xff0c;鼠标滑过字体、点击的字体 4、如果数据超出&#xff0c;出现左右滑动标签 html <div class"activity"><div class"cont"><el-tabsv-if"search &…

实验 | RT-Thread:L1

1 线程间同步 同步是指按预定的先后次序进行运行&#xff0c;线程同步是指多个线程通过特定的机制&#xff08;如互斥量&#xff0c;事件对象&#xff0c;临界区&#xff09;来控制线程之间的执行顺序&#xff0c;也可以说是在线程之间通过同步建立起执行顺序的关系&#xff0…

视频抽帧转图片,opencv和ffmpeg效果测评

最近在做一个项目&#xff0c;需要从视频中抽帧转图片&#xff0c;于是对opencv和ffmpeg效果进行了测评。 文章目录 1. open cv2. ffmpeg3.抽帧效果对比 1. open cv open cv 视频抽图片的教程&#xff0c;推荐以下链接&#xff0c;抽的帧数可以自行调节&#xff01; 用pythono…

maya 设置半径 获取时长,设置时长

maya 选择当前节点的所有子节点&#xff0c;设置半径&#xff0c;获取动画时长&#xff0c;并且设置时长 python 脚本 import maya.cmds as cmds# 获取当前选择的节点 selected_nodes cmds.ls(selectionTrue)# 创建一个列表来存储所需的节点&#xff1a;当前选中的节点及其所…

四川易点慧电子商务:抖音小店引领潮流,先进模式打造电商新标杆

在当下数字化浪潮中&#xff0c;电子商务行业如日中天&#xff0c;四川易点慧电子商务有限公司以其独特的视角和前瞻性的战略布局&#xff0c;成功在抖音小店领域崭露头角&#xff0c;成为行业内的佼佼者。本文将深入剖析四川易点慧电子商务的成功秘诀&#xff0c;以及其在抖音…

Mysql当前列的值等于上一行的值累加前一列的值

Mysql当前列的值等于上一行的值累加前一列的值 前言&#xff1a;公司项目需要做数据可视化&#xff0c;统计一些数据&#xff0c;比如用户增长量&#xff0c;按每天分组&#xff0c;还要计算每天累加的用户量&#xff0c;一开始也是想了很久&#xff0c;不知道怎么做&#xff…

百度网盘svip白嫖永久手机2024最新教程

百度网盘&#xff08;原名百度云&#xff09;是百度推出的一项云存储服务&#xff0c;已覆盖主流PC和手机操作系统&#xff0c;包含Web版、Windows版、Mac版、Android版、iPhone版和Windows Phone版。用户将可以轻松将自己的文件上传到网盘上&#xff0c;并可跨终端随时随地查看…