news 2026/6/10 12:55:28

tensorflow 零基础吃透:TensorFlow 稀疏张量(SparseTensor)的核心操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
tensorflow 零基础吃透:TensorFlow 稀疏张量(SparseTensor)的核心操作

零基础吃透:TensorFlow稀疏张量(SparseTensor)的核心操作

稀疏张量无法直接使用tf.math.add等密集张量的算术算子,必须通过tf.sparse包下的专用工具进行操作。本文拆解加法、矩阵乘法、拼接、切片、元素级运算五大核心操作,结合示例讲清原理、用法和版本兼容细节。

前置准备(必运行)

importtensorflowastf# 复用之前的美观打印函数(调试必备)defpprint_sparse_tensor(st):s="<SparseTensor shape=%s \n values={"%(st.dense_shape.numpy().tolist(),)for(index,value)inzip(st.indices,st.values):s+=f"\n %s: %s"%(index.numpy().tolist(),value.numpy().tolist())returns+"}>"# 示例稀疏张量(后续操作会复用)st2=tf.sparse.from_dense([[1,0,0,8],[0,0,0,0],[0,0,3,0]])

一、稀疏张量加法(tf.sparse.add)

核心原理

仅对同形状稀疏张量的「相同坐标非零值」相加,不同坐标的非零值直接保留,最终输出仍为稀疏张量(仅存储非零结果)。

示例代码

# 构造两个同形状的稀疏张量st_a=tf.sparse.SparseTensor(indices=[[0,2],[3,4]],values=[31,2],dense_shape=[4,10]# 4行10列)st_b=tf.sparse.SparseTensor(indices=[[0,2],[3,0]],values=[56,38],dense_shape=[4,10]# 必须与st_a形状一致)# 稀疏张量加法st_sum=tf.sparse.add(st_a,st_b)print("稀疏张量相加结果:")print(pprint_sparse_tensor(st_sum))

输出解读

<SparseTensor shape=[4, 10] values={ [0, 2]: 87 # st_a[0,2]=31 + st_b[0,2]=56 [3, 0]: 38 # 仅st_b有该坐标,直接保留 [3, 4]: 2 # 仅st_a有该坐标,直接保留 }>

关键注意事项

  • ❌ 形状不同会报错:必须保证dense_shape完全一致;
  • ✅ 结果仅保留非零值:若相加后某坐标值为0(如st_a[0,2]=-56 + st_b[0,2]=56),会被过滤出结果。

二、稀疏×密集矩阵乘法(tf.sparse.sparse_dense_matmul)

核心原理

稀疏张量作为矩阵(需满足矩阵乘法的形状规则),与密集矩阵相乘,无需转换为密集张量,大幅节省内存(超稀疏矩阵效率提升显著)。

示例代码

# 构造2×2的稀疏矩阵(非零值:[0,1]=13,[1,0]=15,[1,1]=17)st_c=tf.sparse.SparseTensor(indices=[[0,1],[1,0],[1,1]],# 注意:原代码的indices写法有误,修正为列表格式values=[13,15,17],dense_shape=(2,2))# 构造2×1的密集矩阵mb=tf.constant([[4],[6]])# 稀疏×密集矩阵乘法product=tf.sparse.sparse_dense_matmul(st_c,mb)print("\n稀疏×密集矩阵乘法结果:")print(product)

计算逻辑(验证结果)

矩阵乘法规则:C × B = [ (0×4+13×6), (15×4+17×6) ]^T

  • 第一行:0×4 + 13×6 = 78
  • 第二行:15×4 + 17×6 = 60 + 102 = 162

输出解读

tf.Tensor( [[ 78] [162]], shape=(2, 1), dtype=int32)

关键注意事项

  • 形状规则:稀疏张量的列数 = 密集矩阵的行数(如2×2 × 2×1 合法);
  • 索引顺序:建议先通过tf.sparse.reorder排序稀疏张量索引,避免运算异常。

三、稀疏张量拼接(tf.sparse.concat)

核心原理

沿指定轴(如列轴axis=1)拼接多个稀疏张量,要求除拼接轴外的其他轴形状一致,最终输出合并后的稀疏张量。

示例代码

# 构造3个待拼接的稀疏张量(行维度均为8,列维度不同)sparse_pattern_A=tf.sparse.SparseTensor(indices=[[2,4],[3,3],[3,4],[4,3],[4,4],[5,4]],values=[1]*6,dense_shape=[8,5]# 8行5列)sparse_pattern_B=tf.sparse.SparseTensor(indices=[[0,2],[1,1],[1,3],[2,0],[2,4],[2,5],[3,5],[4,5],[5,0],[5,4],[5,5],[6,1],[6,3],[7,2]],values=[1]*14,dense_shape=[8,6]# 8行6列)sparse_pattern_C=tf.sparse.SparseTensor(indices=[[3,0],[4,0]],values=[1]*2,dense_shape=[8,6]# 8行6列)# 沿列轴(axis=1)拼接sparse_pattern=tf.sparse.concat(axis=1,# 列轴拼接(行轴保持8不变)sp_inputs=[sparse_pattern_A,sparse_pattern_B,sparse_pattern_C])# 转换为密集张量查看拼接结果print("\n拼接后的密集张量:")print(tf.sparse.to_dense(sparse_pattern))

输出解读

拼接后形状为8×(5+6+6)=8×17,非零值按原位置分布在对应列区间:

  • A的非零值在列0~4;
  • B的非零值在列5~10;
  • C的非零值在列11~16。

关键注意事项

  • 拼接轴外的维度必须一致:如示例中所有张量的行维度均为8,仅列维度不同;
  • 拼接后非零值位置:原张量的列索引自动偏移(如B的列0→拼接后的列5)。

四、稀疏张量切片(tf.sparse.slice)

核心原理

沿指定轴截取稀疏张量的子区域,仅保留「切片范围内的非零值」,输出新的稀疏张量(形状为指定的size)。

函数参数

参数作用
start切片起始坐标(列表/张量),长度=张量秩(如[0,0]表示行0列0开始)
size切片大小(列表/张量),长度=张量秩(如[8,5]表示截取8行5列)

示例代码

# 对拼接后的张量切片(还原原张量)sparse_slice_A=tf.sparse.slice(sparse_pattern_A,start=[0,0],size=[8,5])sparse_slice_B=tf.sparse.slice(sparse_pattern_B,start=[0,5],size=[8,6])sparse_slice_C=tf.sparse.slice(sparse_pattern_C,start=[0,10],size=[8,6])# 打印切片结果(转密集张量)print("\n切片A(8×5):")print(tf.sparse.to_dense(sparse_slice_A))print("\n切片B(8×1):")# 原B的start=[0,5],size=[8,6]但仅列5有值,故输出8×1print(tf.sparse.to_dense(sparse_slice_B))print("\n切片C(8×0):")# 无符合条件的非零值,输出空print(tf.sparse.to_dense(sparse_slice_C))

输出解读

切片A(8×5): [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 1] [0 0 0 1 1] [0 0 0 1 1] [0 0 0 0 1] [0 0 0 0 0] [0 0 0 0 0]] 切片B(8×1): [[0] [0] [1] [1] [1] [1] [0] [0]] 切片C(8×0): []

关键注意事项

  • 切片范围外的非零值会被过滤:如切片B仅截取列5,原B的其他列非零值被丢弃;
  • 空切片:无符合条件的非零值时,输出shape=(8,0)的空稀疏张量。

五、元素级运算(仅修改非零值)

场景:对稀疏张量的所有非零值做统一运算(如+5)

方式1:TF2.4+ 专用(tf.sparse.map_values)

tf.sparse.map_values专门对稀疏张量的values(非零值)做元素级运算,零值保持不变。

# 对st2的非零值+5st2_plus_5=tf.sparse.map_values(tf.add,st2,5)print("\nTF2.4+ 非零值+5(密集张量):")print(tf.sparse.to_dense(st2_plus_5))
方式2:TF2.4前 兼容方案

手动构造新的SparseTensor,仅修改values,保留indicesdense_shape

# 老版本兼容写法:直接修改valuesst2_plus_5_compat=tf.sparse.SparseTensor(st2.indices,# 保留原坐标st2.values+5,# 非零值+5st2.dense_shape# 保留原形状)print("\n老版本兼容 非零值+5(密集张量):")print(tf.sparse.to_dense(st2_plus_5_compat))

输出解读(两种方式结果一致)

[[ 6 0 0 13] [ 0 0 0 0] [ 0 0 8 0]]
  • 仅非零值被修改:原1→68→133→8
  • 零值保持不变:符合稀疏张量的设计初衷(仅操作有效数据)。

核心操作总结表

操作函数核心要求适用场景
稀疏加法tf.sparse.add张量形状完全一致同形状稀疏张量逐坐标相加
稀疏-密集矩阵乘法tf.sparse.sparse_dense_matmul稀疏列数=密集行数超稀疏矩阵与密集矩阵相乘
稀疏拼接tf.sparse.concat非拼接轴形状一致合并多个稀疏张量的列/行
稀疏切片tf.sparse.slicestart/size长度=张量秩截取稀疏张量的子区域
元素级运算tf.sparse.map_valuesTF2.4+,仅修改非零值对非零值做统一算术运算(+/-/*//)

避坑关键

  1. 形状匹配:所有稀疏张量操作的核心是「形状兼容」,形状不匹配会直接报错;
  2. 索引顺序:运算前建议用tf.sparse.reorder排序索引,避免算子异常;
  3. 版本兼容tf.sparse.map_values仅TF2.4+支持,老版本需手动修改values
  4. 零值处理:所有操作均仅处理非零值,零值始终保持隐式存储(不占用内存)。

掌握这些操作,就能高效处理NLP(TF-IDF)、计算机视觉(稀疏像素)等场景下的超稀疏数据,大幅降低内存占用和计算开销。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 19:10:46

Unity游戏自动翻译终极解决方案:从问题识别到快速上手避坑指南

Unity游戏自动翻译终极解决方案&#xff1a;从问题识别到快速上手避坑指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 当你沉浸在一款优秀的Unity游戏中&#xff0c;却被陌生的语言界面阻隔在外&…

作者头像 李华
网站建设 2026/6/10 6:12:23

原神智能助手终极指南:全自动游戏体验完整教程

原神智能助手终极指南&#xff1a;全自动游戏体验完整教程 【免费下载链接】better-genshin-impact &#x1f368;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动派遣 | 一键强化 - UI Automation Testing Tools For Genshi…

作者头像 李华
网站建设 2026/6/3 9:56:48

5分钟掌握轮播指示器创意样式:让你的分页点从“路人“变“主角“

还在为轮播图千篇一律的圆点分页而苦恼&#xff1f;想让你的轮播指示器成为页面设计的亮点吗&#xff1f;本文将带你突破传统思维&#xff0c;用3种惊艳的创意方案彻底改造轮播dots样式&#xff0c;让分页指示器从功能组件升级为视觉焦点&#xff01; 【免费下载链接】slick th…

作者头像 李华
网站建设 2026/6/9 15:03:25

ORACLE学习笔记总结(数据库常见错误及应对措施)

一、语句失败&#xff08;Statement Failure&#xff09;定义SQL语句因语法错误、权限不足或资源限制而无法正常执行&#xff0c;是最轻微的故障类型。常见场景语法错误&#xff1a;SELEC * FROM emp;&#xff08;拼写错误&#xff09;权限不足&#xff1a;普通用户执行DROP TA…

作者头像 李华
网站建设 2026/6/8 11:32:41

ThinkPad双风扇终极静音指南:TPFanCtrl2完整配置与优化

ThinkPad双风扇终极静音指南&#xff1a;TPFanCtrl2完整配置与优化 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 还在为ThinkPad笔记本的持续风扇噪音而烦恼吗&#…

作者头像 李华
网站建设 2026/6/8 5:54:23

VS Code远程连接树莓派超详细教程(图文)

目录 一、前置准备&#xff1a;两端环境配置 1.1 树莓派端配置&#xff08;关键步骤&#xff09; ① 确保树莓派联网 ② 开启SSH服务&#xff08;必须&#xff09; ③ 获取树莓派IP地址 ④ 确认用户名/密码 1.2 电脑端配置 ① 安装VS Code ② 安装Remote - SSH插件和p…

作者头像 李华