学习笔记(26):线性代数-张量的降维求和,简单示例

学习笔记(26):线性代数-张量的降维求和,简单示例

1.先理解 “轴(Axis)” 的含义

张量的 “轴” 可以理解为 维度的方向索引 。对于形状为 (2, 3, 4) 的张量,3 个轴的含义是:

  • 轴 0(axis=0):最外层维度,控制 “块” 的数量,长度为 2(即有 2 个 “子张量” 叠在这个维度上 )。
  • 轴 1(axis=1):中间维度,控制每个 “块” 里 “行” 的数量,长度为 3(每个子张量有 3 行 )。
  • 轴 2(axis=2):最内层维度,控制每行里 “列” 的数量,长度为 4(每行有 4 列 )。

可以类比成 “2 摞书,每摞有 3 页,每页有 4 个字”,3 个轴对应 “摞 → 页 → 字” 的层级。

2. 求和操作的本质:“压缩” 目标轴

求和(sum)的核心逻辑是 对目标轴上的所有元素做聚合(相加),这会让该轴的 “长度坍缩为 1”,最终在形状里直接 “去掉该轴” 。

本质上,“轴” 只是维度的索引,求和操作通过 压缩目标轴的长度 改变形状,这是张量维度操作的基础逻辑,也和 “广播(Broadcasting)”、“降维(Reduce)” 等操作的原理相通。

一、降维概念

沿轴求和属于降维操作,核心是通过 “压缩一个维度” 减少张量的维度数量或某一维度的长度,概念结合的角度解释:

1.1、从维度数量看降维

原始张量X3 维(形状(2, 3, 4) ),沿任意轴求和后:

  • 沿轴 0 求和,结果是2 维(形状(3, 4) )
  • 沿轴 1 求和,结果是2 维(形状(2, 4) )
  • 沿轴 2 求和,结果是2 维(形状(2, 3) )

直观体现:3 维→2 维,维度数量减少了 1,这是典型的降维(从更高维数变为更低维数 )。

1.2、从维度长度看 “局部降维”

即使维度数量没变(比如 4 维张量沿中间轴求和),某一维度的长度会 “坍缩”:
假设张量形状是(2, 3, 4, 5),沿轴 1 求和后:

  • 原轴 1 长度是 3,求和后该轴长度消失(形状变为(2, 4, 5) )
  • 整体维度数量从 4→3,也是降维;若从 “维度长度组合” 看,轴 1 的长度被压缩掉,相当于该维度的 “信息被聚合”,也属于降维的一种表现(压缩特定维度,减少数据在该维度的分布 )。

1.3、降维的本质:信息聚合

沿轴求和时,把该轴上多个元素的信息聚合为 1 个(通过相加),导致该轴 “失去独立存在的意义”:

  • 原始轴 0 有 2 个子张量(2 条独立信息 ),求和后合并成 1 组,这 2 条信息被聚合了→轴 0 被 “降维”
  • 可以类比:把多本 “书”(轴 0 的子张量 )的内容按页、按行相加,相当于 “减少了书的数量” 这个维度的独立性。

1.4、和其他降维操作的对比

除了sum,常见的降维操作还有:

  • mean(沿轴求平均 ):同样压缩轴,维度数量 / 长度减少
  • max/min(沿轴取最大 / 最小 ):也是聚合信息,降维
  • flatten(展平 ):直接把高维张量压成 1 维,是更极端的降维

sum的特殊点在于通过加法聚合信息,本质上和这些操作一样,都是让张量的维度变少 / 某维度长度缩短,所以属于降维。

简单说:只要操作后,张量的维度数量减少,或者某一维度的长度从N>1变成1(甚至消失 ),都属于降维,沿轴求和完美符合这个特征,所以是降维操作。

二、示例:一个具有形状(2,3,4)的张量,在轴0、1、2上的求和输出是什么形状?

2.1、代码示例

import torch# 创建一个形状为 (2, 3, 4) 的张量,每个元素是 1 到 24 的整数
X = torch.arange(1, 25).reshape(2, 3, 4)
print("原始张量 X 的形状:", X.shape)
print("X 的内容:\n", X)# 沿轴 0 求和(压缩轴 0)
sum_axis0 = X.sum(axis=0)
print("\n沿轴 0 求和后的形状:", sum_axis0.shape)
print("沿轴 0 求和后的结果:\n", sum_axis0)# 沿轴 1 求和(压缩轴 1)
sum_axis1 = X.sum(axis=1)
print("\n沿轴 1 求和后的形状:", sum_axis1.shape)
print("沿轴 1 求和后的结果:\n", sum_axis1)# 沿轴 2 求和(压缩轴 2)
sum_axis2 = X.sum(axis=2)
print("\n沿轴 2 求和后的形状:", sum_axis2.shape)
print("沿轴 2 求和后的结果:\n", sum_axis2)

2.2、输出结果与解释

2.2.1. 原始张量 X
原始张量 X 的形状: torch.Size([2, 3, 4])
X 的内容:tensor([[[ 1,  2,  3,  4],[ 5,  6,  7,  8],[ 9, 10, 11, 12]],[[13, 14, 15, 16],[17, 18, 19, 20],[21, 22, 23, 24]]])
  • 形状解读
    • 轴 0(长度 2):2 个 “子张量”(用外层中括号分隔)。
    • 轴 1(长度 3):每个子张量有 3 行。
    • 轴 2(长度 4):每行有 4 列。
2.2.2. 沿轴 0 求和(axis=0
沿轴 0 求和后的形状: torch.Size([3, 4])
沿轴 0 求和后的结果:tensor([[14, 16, 18, 20],[22, 24, 26, 28],[30, 32, 34, 36]])
  • 操作逻辑
    将轴 0 的 2 个子张量 对应位置相加(例如 X[0,0,0] + X[1,0,0] = 1+13=14)。
  • 形状变化
    轴 0(长度 2)被压缩,结果形状变为 (3, 4)
2.2.3. 沿轴 1 求和(axis=1
沿轴 1 求和后的形状: torch.Size([2, 4])
沿轴 1 求和后的结果:tensor([[15, 18, 21, 24],[51, 54, 57, 60]])
  • 操作逻辑
    对每个子张量的 3 行分别求和(例如第一行 [1,2,3,4] 与第二行 [5,6,7,8]、第三行 [9,10,11,12] 按列相加,得到 [15,18,21,24])。
  • 形状变化
    轴 1(长度 3)被压缩,结果形状变为 (2, 4)
2.2.4. 沿轴 2 求和(axis=2
沿轴 2 求和后的形状: torch.Size([2, 3])
沿轴 2 求和后的结果:tensor([[10, 26, 42],[58, 74, 90]])
  • 操作逻辑
    对每行的 4 个元素分别求和(例如 X[0,0] = [1,2,3,4] 求和得 10,X[0,1] = [5,6,7,8] 求和得 26)。
  • 形状变化
    轴 2(长度 4)被压缩,结果形状变为 (2, 3)

2.3、可视化理解

用表格形式更直观地展示求和过程:

2.3.1、原始张量 X
子张量 0:
┌───────┬───────┬───────┬───────┐
│ 1     │ 2     │ 3     │ 4     │
├───────┼───────┼───────┼───────┤
│ 5     │ 6     │ 7     │ 8     │
├───────┼───────┼───────┼───────┤
│ 9     │ 10    │ 11    │ 12    │
└───────┴───────┴───────┴───────┘子张量 1:
┌───────┬───────┬───────┬───────┐
│ 13    │ 14    │ 15    │ 16    │
├───────┼───────┼───────┼───────┤
│ 17    │ 18    │ 19    │ 20    │
├───────┼───────┼───────┼───────┤
│ 21    │ 22    │ 23    │ 24    │
└───────┴───────┴───────┴───────┘
2.3.2、沿轴 0 求和(压缩子张量)
结果:
┌───────┬───────┬───────┬───────┐
│ 1+13  │ 2+14  │ 3+15  │ 4+16  │
├───────┼───────┼───────┼───────┤
│ 5+17  │ 6+18  │ 7+19  │ 8+20  │
├───────┼───────┼───────┼───────┤
│ 9+21  │ 10+22 │ 11+23 │ 12+24 │
└───────┴───────┴───────┴───────┘
2.3.3、沿轴 1 求和(压缩行)
子张量 0 结果:
┌───────────────────┐
│ 1+5+9 │ 2+6+10 │
├───────────────────┤
│ 3+7+11│ 4+8+12 │
└───────────────────┘子张量 1 结果:
┌───────────────────┐
│ 13+17+21 │ 14+18+22 │
├───────────────────┤
│ 15+19+23 │ 16+20+24 │
└───────────────────┘
2.3.4、沿轴 2 求和(压缩列)
子张量 0 结果:
┌───────────┐
│ 1+2+3+4   │
├───────────┤
│ 5+6+7+8   │
├───────────┤
│ 9+10+11+12│
└───────────┘子张量 1 结果:
┌──────────────┐
│ 13+14+15+16  │
├──────────────┤
│ 17+18+19+20  │
├──────────────┤
│ 21+22+23+24  │
└──────────────┘
  • 沿轴 k 求和:将该轴上的所有元素相加,导致该轴的长度 从 N 坍缩为 1,最终形状中 去掉轴 k

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

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

相关文章

健康档案实训室:构建全周期健康管理的数据基石

一、健康档案实训室建设背景 随着“健康中国2030”战略深入推进,健康档案作为居民健康数据的核心载体,在疾病预防、慢性病管理、医疗决策等领域的价值日益凸显。在此背景下,健康档案实训室建设成为职业院校对接政策要求、培养专业健康管理…

【MATLAB第119期】基于MATLAB的KRR多输入多输出全局敏感性分析模型运用(无目标函数,考虑代理模型)

【MATLAB第119期】基于MATLAB的KRR多输入多输出全局敏感性分析模型运用(无目标函数,考虑代理模型) 下一期研究SHAP的多输入多输出敏感性分析方法 一、SOBOL(无目标函数) (1)针对简单线性数据…

Linux常用文件目录命令

浏览目录命令: ls 、pwd目录操作命令:cd、mkdir、rmdir浏览文件命令:cat、more、less、head、tail文件操作命令:cp、rm、mv、find、grep、tar 浏览目录命令 ls ◼ 命令名称:ls ◼ 命令英文原意:list ◼ …

PIN码vs密码,电脑登录的快捷键你用对了吗?

你是否也遇到过这样的窘境:信心满满地输入电脑开机密码,屏幕却无情地提示“密码错误”。仔细一看,才发现登录界面悄悄地变成了要求输入“PIN码”。这种因为混淆了PIN码和账户密码而导致的开机失败,相信不少朋友都碰到过。 PIN码作…

【大模型科普】AIGC技术发展与应用实践(一文读懂AIGC)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能(AI)通过算法模拟人类智能,利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络(如ChatGPT&…

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…

XXE漏洞知识

目录 1.XXE简介与危害 XML概念 XML与HTML的区别 1.pom.xml 主要作用 2.web.xml 3.mybatis 2.XXE概念与危害 案例:文件读取(需要Apache >5.4版本) 案例:内网探测(鸡肋) 案例:执行命…

02-性能方案设计

需求分析与测试设计 根据具体的性能测试需求,确定测试类型,以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通,初步确定压测方案及具体的性能指标QA完成性能测试设计后,需产出测试方案文档发送邮件到项目组&…

STL优先级队列的比较函数与大堆小堆的关系

STL中的priority_queue&#xff08;优先级队列&#xff09;通过比较函数来确定元素的优先级顺序&#xff0c;从而决定其内部是形成大堆还是小堆。以下是关键点总结&#xff1a; 默认行为与大堆&#xff1a; 默认情况下&#xff0c;priority_queue使用std::less<T>作为比较…

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…

OD 算法题 B卷【反转每对括号间的子串】

文章目录 反转每对括号间的子串 反转每对括号间的子串 给出一个字符串s&#xff0c; 仅含有小写英文字母和英文括号’(’ ‘)’&#xff1b;按照从括号内到外的顺序&#xff0c;逐层反转每对括号中的字符串&#xff0c;并返回最终的结果&#xff1b;结果中不能包含任何括号&am…

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档&#xff1f;从规划到实践的完整指南 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…

详细讲解Flutter GetX的使用

Flutter GetX 框架详解&#xff1a;状态管理、路由与依赖注入 GetX 是 Flutter 生态中一款强大且轻量级的全功能框架&#xff0c;集成了状态管理、路由管理和依赖注入三大核心功能。其设计理念是简洁高效&#xff0c;通过最小的代码实现最大的功能&#xff0c;特别适合快速开发…

【大模型:知识库管理】--Dify接入RAGFlow 知识库

ragflow的官方文档&#xff1a; HTTP API 接口 |抹布流 --- HTTP API | RAGFlow 接着前文&#xff0c;我们已经创建了知识库&#xff0c;那么如何才能使用它呢&#xff1f; 当然也是通过网络API的形式去调用它。本文将讲解两种方式&#xff1a; Dify调用python源码调用 目录…

Vue 模板配置项深度解析

Vue 模板配置项深度解析 在 Vue 组件开发中&#xff0c;template 是定义组件视图结构的核心配置项。作为 Vue 专家&#xff0c;我将全面解析模板的各个方面&#xff0c;帮助你掌握高效构建 Vue 组件的艺术。 一、模板基础概念 1. 模板的本质 声明式渲染&#xff1a;描述 UI…

基于深度哈希与图索引的十亿级图像近重复检测系统

引言 在上一篇文章中,我们介绍了基于Vision API和SimHash的亿级图像去重方案。本文将更进一步,探讨如何应对十亿级图像库的近重复检测挑战,提出一种结合深度哈希学习与图索引的创新架构。该系统在多个关键指标上比传统方法提升显著: 检测精度提升:mAP@100达到0.92(传统方…

Python开发基础手语识别(基础框架版)

一、前期准备 想要实现这些&#xff0c;首先就是要模拟出来一个大致的框架&#xff0c;方便后续开展&#xff0c;下面的就是随便写的一个框架&#xff0c;大家凑合看看就行&#xff0c;基本上是这个意思&#xff1a; from tkinter import *w Tk() w.title("手语识别&am…

React从基础入门到高级实战:React 实战项目 - 项目一:在线待办事项应用

React 实战项目&#xff1a;在线待办事项应用 欢迎来到本 React 开发教程专栏的第 26 篇&#xff01;在之前的 25 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件、状态、路由和性能优化等核心知识。这一次&#xff0c;我们将通过一个…

1991-2024年上市公司个股换手率数据

1991-2024年上市公司个股换手率数据 1、时间&#xff1a;1991-2024年 2、来源&#xff1a;上海证券交易所和深圳证券交易所 3、指标&#xff1a;证券代码、交易年份、开始日期、截止日期、年换手率(流通股数)(%)、年换手率(总股数)(%)、日均换手率(流通股数)(%)、日均换手率…