news 2026/4/22 21:45:10

tensorflow 零基础吃透:创建 tf.sparse.SparseTensor 的核心方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
tensorflow 零基础吃透:创建 tf.sparse.SparseTensor 的核心方法

零基础吃透:创建tf.sparse.SparseTensor的核心方法

创建tf.sparse.SparseTensor是使用稀疏张量的基础,TensorFlow提供了直接构造从密集张量转换两种核心方式,同时可通过自定义函数美化打印结果(便于调试),也能轻松转回密集张量。以下结合示例拆解每个步骤的原理、用法和注意事项。

一、环境警告说明(先避坑)

代码中出现的GPU相关警告(如cuFFT/cuDNN/cuBLAS factory)是因为本地环境的GPU库重复注册/缺失,不影响稀疏张量的核心功能(CPU环境下可正常运行),无需处理即可继续。

二、方式1:直接构造SparseTensor(核心参数)

2.1 构造原理

直接通过tf.sparse.SparseTensor构造,需指定三个核心参数(COO格式):

参数名要求示例
indices二维张量(dtype=int64),每行是一个非零值的坐标,形状[N, rank][[0,3], [2,4]](2个非零值,二维坐标)
values一维张量,长度=N(与indices行数一致),存储非零值[10,20]
dense_shape一维张量(dtype=int64),指定稀疏张量对应的密集形状,长度=rank[3,10](3行10列的二维张量)

2.2 示例代码

importtensorflowastf# 直接构造稀疏张量st1=tf.sparse.SparseTensor(indices=[[0,3],[2,4]],# 非零值坐标:(0,3)=10,(2,4)=20values=[10,20],# 非零值列表dense_shape=[3,10]# 对应密集张量形状:3行10列)# 原生打印(显示三个核心组件)print("原生打印SparseTensor:")print(st1)

2.3 输出解读

SparseTensor(indices=tf.Tensor( [[0 3] [2 4]], shape=(2, 2), dtype=int64), values=tf.Tensor([10 20], shape=(2,), dtype=int32), dense_shape=tf.Tensor([ 3 10], shape=(2,), dtype=int64))
  • indices:二维int64张量,2行2列(2个非零值,二维坐标);
  • values:一维int32张量,存储2个非零值;
  • dense_shape:一维int64张量,指定密集形状为[3,10]

三、美观打印SparseTensor(调试必备)

原生打印的格式不直观,可自定义函数将“坐标-值”一一对应打印,便于快速理解稀疏张量的内容。

3.1 自定义打印函数原理

遍历indicesvalues,逐个拼接“坐标: 值”的格式,最终输出结构化的字符串。

3.2 示例代码

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+"}>"# 美观打印st1print("\n美观打印SparseTensor:")print(pprint_sparse_tensor(st1))

3.3 输出解读

<SparseTensor shape=[3, 10] values={ [0, 3]: 10 [2, 4]: 20}>

直观看到:

  • 稀疏张量对应密集形状是3行10列
  • 非零值位置:(0,3)为10,(2,4)为20;
  • 其余位置均为隐式零值。

四、方式2:从密集张量转换为SparseTensor

4.1 核心函数:tf.sparse.from_dense

自动提取密集张量中的非零值及其坐标,生成对应的SparseTensor(无需手动指定indices/values)。

4.2 示例代码

# 从密集张量创建稀疏张量dense_tensor=[[1,0,0,8],[0,0,0,0],[0,0,3,0]]st2=tf.sparse.from_dense(dense_tensor)# 美观打印转换后的稀疏张量print("从密集张量转换的SparseTensor:")print(pprint_sparse_tensor(st2))

4.3 输出解读

<SparseTensor shape=[3, 4] values={ [0, 0]: 1 [0, 3]: 8 [2, 2]: 3}>
  • 密集张量的非零值:(0,0)=1(0,3)=8(2,2)=3,其余为0;
  • tf.sparse.from_dense自动过滤零值,仅保留非零值的坐标和值。

五、稀疏张量转回密集张量

5.1 核心函数:tf.sparse.to_dense

根据SparseTensor的indices/values/dense_shape,填充非零值,其余位置补0,生成密集张量。

5.2 示例代码

# 稀疏张量转回密集张量st3=tf.sparse.to_dense(st2)print("\n稀疏张量转回的密集张量:")print(st3)

5.3 输出解读

tf.Tensor( [[1 0 0 8] [0 0 0 0] [0 0 3 0]], shape=(3, 4), dtype=int32)

与原始密集张量完全一致,验证了转换的可逆性。

六、关键注意事项(避坑核心)

1. 数据类型要求

  • indicesdense_shape的dtype必须是int64(TensorFlow强制要求,手动指定时若用int32会报错);
  • values的dtype可自定义(int32/float32等),但需与业务场景匹配。

2. 索引格式要求

  • indices的每行长度必须等于dense_shape的长度(即张量的秩):
    • 二维张量的索引是[行, 列](长度2);
    • 三维张量的索引是[深度, 行, 列](长度3)。

3. 显式零值的处理

  • tf.sparse.from_dense会自动过滤隐式零值(未存储的零),但如果密集张量中主动存储0(显式零值),会被保留:
    # 含显式零值的密集张量dense_with_zero=[[1,0,0],[0,0,0],[2,0,3]]st_with_zero=tf.sparse.from_dense(dense_with_zero)print(pprint_sparse_tensor(st_with_zero))# 仅保留1、2、3,过滤0

4. 空张量处理

  • 若密集张量全为0,tf.sparse.from_dense生成的SparseTensor的indicesvalues为空:
    dense_all_zero=[[0,0],[0,0]]st_all_zero=tf.sparse.from_dense(dense_all_zero)print(st_all_zero.indices.numpy())# 空数组 []print(st_all_zero.values.numpy())# 空数组 []

七、核心总结

操作函数/方法核心用途
直接构造稀疏张量tf.sparse.SparseTensor手动指定非零值坐标和值(精准控制)
密集→稀疏tf.sparse.from_dense自动提取非零值,快速生成稀疏张量
稀疏→密集tf.sparse.to_dense还原为密集张量,适配不支持稀疏的算子
美观打印稀疏张量自定义pprint_sparse_tensor函数调试时直观查看非零值的坐标和值

掌握这三种核心操作,就能灵活创建和转换稀疏张量,满足NLP/计算机视觉等场景下的稀疏数据处理需求。

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

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

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

作者头像 李华
网站建设 2026/4/18 0:05:07

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

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

作者头像 李华
网站建设 2026/4/17 18:32:09

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

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

作者头像 李华
网站建设 2026/4/23 11:31:13

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

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

作者头像 李华
网站建设 2026/4/23 11:31:29

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/4/23 11:31:17

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

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

作者头像 李华