news 2026/4/14 16:34:54

tensorflow 零基础吃透:RaggedTensor 与其他张量类型的转换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
tensorflow 零基础吃透:RaggedTensor 与其他张量类型的转换

零基础吃透:RaggedTensor与其他张量类型的转换

RaggedTensor 提供了原生方法,可与 TensorFlow 另外两种核心张量类型(密集张量tf.Tensor、稀疏张量tf.SparseTensor)双向转换,覆盖“补0/去填充”“稀疏存储/可变长度处理”等核心场景。以下按「转换方向」拆解每个方法的用法、原理和适用场景。

前置准备(可运行代码)

importtensorflowastf# 基础RaggedTensor示例(文本序列)ragged_sentences=tf.ragged.constant([['Hi'],# 行0:1个元素['Welcome','to','the','fair'],# 行1:4个元素['Have','fun']])# 行2:2个元素

转换1:RaggedTensor → 密集张量(tf.Tensor)

核心方法:ragged_tensor.to_tensor(default_value, shape=None)

将不规则张量补全为固定形状的密集张量,不足长度的位置填充指定默认值。

参数作用
default_value必选:填充值(如空字符串''、0、-1等),需与张量元素类型匹配
shape可选:目标密集张量的形状(如[None, 10]表示行数可变、列数固定10);不指定则补到「最大行长度」

示例代码

# 转换为密集张量:补空字符串,列数固定为10dense_sentences=ragged_sentences.to_tensor(default_value='',shape=[None,10])print("Ragged → 密集张量(shape=[None,10]):")print(dense_sentences)# 不指定shape:自动补到最大行长度(4列)dense_sentences_auto=ragged_sentences.to_tensor(default_value='')print("\nRagged → 密集张量(自动补最大长度):")print(dense_sentences_auto)

运行结果

Ragged → 密集张量(shape=[None,10]): tf.Tensor( [[b'Hi' b'' b'' b'' b'' b'' b'' b'' b'' b''] [b'Welcome' b'to' b'the' b'fair' b'' b'' b'' b'' b'' b''] [b'Have' b'fun' b'' b'' b'' b'' b'' b'' b'' b'']], shape=(3, 10), dtype=string) Ragged → 密集张量(自动补最大长度): tf.Tensor( [[b'Hi' b'' b'' b''] [b'Welcome' b'to' b'the' b'fair'] [b'Have' b'fun' b'' b'']], shape=(3, 4), dtype=string)

核心解读

  • 补全逻辑:每行按目标长度填充default_value,比如行0仅1个元素,补9个空字符串到10列;
  • 适用场景:需将RaggedTensor传入不支持不规则张量的层/函数(如老版本LSTM、部分第三方库)。

转换2:密集张量(tf.Tensor)→ RaggedTensor

核心方法:tf.RaggedTensor.from_tensor(tensor, padding)

从含填充值的密集张量中剔除填充值,恢复为可变长度的RaggedTensor(仅保留有效元素)。

参数作用
tensor必选:含填充值的密集张量(如补0/-1的序列)
padding必选:填充值(如-1、0),张量中该值会被剔除,仅保留非填充值

示例代码

# 含填充值的密集张量(-1为填充)dense_x=tf.constant([[1,3,-1,-1],[2,-1,-1,-1],[4,5,8,9]])# 转换为RaggedTensor:剔除-1ragged_x=tf.RaggedTensor.from_tensor(dense_x,padding=-1)print("密集张量 → Ragged(剔除填充值-1):")print(ragged_x)

运行结果

<tf.RaggedTensor [[1, 3], [2], [4, 5, 8, 9]]>

核心解读

  • 去填充逻辑:遍历每行,删除所有padding指定的值,仅保留有效元素;
  • 适用场景:从“补0/补-1的密集序列”恢复原始可变长度结构(如文本预处理后去填充)。

转换3:RaggedTensor → 稀疏张量(tf.SparseTensor)

核心方法:ragged_tensor.to_sparse()

将不规则张量转换为稀疏张量,仅存储非空元素的坐标+值,节省内存(无填充值存储)。

示例代码

# Ragged → SparseTensorsparse_sentences=ragged_sentences.to_sparse()print("Ragged → SparseTensor:")print("indices(非空元素坐标):",sparse_sentences.indices)print("values(非空元素值):",sparse_sentences.values)print("dense_shape(对应密集张量形状):",sparse_sentences.dense_shape)

运行结果

indices(非空元素坐标): tf.Tensor( [[0 0] [1 0] [1 1] [1 2] [1 3] [2 0] [2 1]], shape=(7, 2), dtype=int64) values(非空元素值): tf.Tensor([b'Hi' b'Welcome' b'to' b'the' b'fair' b'Have' b'fun'], shape=(7,), dtype=string) dense_shape(对应密集张量形状): tf.Tensor([3 4], shape=(2,), dtype=int64)

核心解读

  • 转换逻辑:
    1. indices:所有非空元素的「行+列」坐标(如[0,0]对应行0列0的Hi);
    2. values:按坐标顺序排列的非空元素值;
    3. dense_shape:对应密集张量的形状(行数=3,最大列数=4);
  • 适用场景:存储/传输大规模可变长度数据(SparseTensor仅存有效元素,比密集张量省内存)。

转换4:稀疏张量(tf.SparseTensor)→ RaggedTensor

核心方法:tf.RaggedTensor.from_sparse(sparse_tensor)

将稀疏张量按行整理为可变长度的RaggedTensor,空行保留为空列表。

示例代码

# 定义SparseTensor(3行3列,非空元素:[0,0]='a'、[2,0]='b'、[2,1]='c')st=tf.SparseTensor(indices=[[0,0],[2,0],[2,1]],# 非空元素坐标values=['a','b','c'],# 非空元素值dense_shape=[3,3]# 对应密集张量形状)# Sparse → RaggedTensorragged_from_sparse=tf.RaggedTensor.from_sparse(st)print("Sparse → RaggedTensor:")print(ragged_from_sparse)

运行结果

<tf.RaggedTensor [[b'a'], [], [b'b', b'c']]>

核心解读

  • 转换逻辑:
    1. 按行分组SparseTensor的非空元素,每行的元素按列索引升序排列;
    2. 无元素的行(如行1)保留为空列表;
  • 适用场景:将稀疏存储的可变长度数据转换为RaggedTensor,利用其更友好的API(如切片、运算符、Keras适配)。

核心注意事项(避坑)

1. 类型匹配

  • 转换时default_value/padding的类型必须与张量元素类型一致(如字符串张量不能用0填充);
  • SparseTensor转RaggedTensor时,indices需按行/列索引有序(TF会自动排序,无需手动处理)。

2. 形状约束

  • to_tensor(shape=...)指定的形状不能小于RaggedTensor的最大长度(如最大列数4,不能指定shape=[None,3],会报错);
  • from_tensor仅支持“末尾维度有填充值”的密集张量(如二维张量仅列维度补填充,行维度需固定)。

3. 空值处理

  • RaggedTensor的空行([])转换为密集张量时,会填充default_value
  • SparseTensor的空行转换为RaggedTensor时,保留为空列表(无填充)。

转换场景总结

转换方向核心方法适用场景
Ragged → Tensorto_tensor(default_value, shape)适配不支持Ragged的层/函数(如老版LSTM)
Tensor → Raggedfrom_tensor(tensor, padding)去除密集张量的填充值,恢复可变长度
Ragged → Sparseto_sparse()大规模数据存储/传输(节省内存)
Sparse → Raggedfrom_sparse(sparse_tensor)利用Ragged的友好API(切片、运算符、Keras)

这四类转换覆盖了RaggedTensor在数据预处理、模型输入、存储传输等全流程的适配需求,是处理可变长度数据的核心工具。

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

AYA桌面控制:5分钟掌握Android设备高效管理终极指南

AYA桌面控制&#xff1a;5分钟掌握Android设备高效管理终极指南 【免费下载链接】aya Android adb desktop app 项目地址: https://gitcode.com/gh_mirrors/aya/aya 你是否曾经为了管理Android设备而不得不记住各种复杂的ADB命令&#xff1f;AYA桌面控制工具正是为解决这…

作者头像 李华
网站建设 2026/4/15 12:35:12

Inkscape光学插件:如何在矢量绘图中实现精准光线追踪?

Inkscape光学插件&#xff1a;如何在矢量绘图中实现精准光线追踪&#xff1f; 【免费下载链接】inkscape-raytracing An extension for Inkscape that makes it easier to draw optical diagrams. 项目地址: https://gitcode.com/gh_mirrors/in/inkscape-raytracing 你…

作者头像 李华
网站建设 2026/4/6 9:46:09

20、Snort规则选项与iptables数据包过滤

Snort规则选项与iptables数据包过滤 在网络安全防护中,Snort和iptables是常用的工具。Snort是一款强大的入侵检测系统(IDS),而iptables则是Linux系统中常用的防火墙工具。本文将介绍一些Snort规则选项,这些选项不仅可以在Snort中使用,还能在iptables中找到对应的匹配和过…

作者头像 李华
网站建设 2026/4/14 20:49:39

(EUDR)欧盟零毁林法案,EUDR到底是什么?

一、EUDR到底是什么&#xff1f;为什么被称为“丛林大考”&#xff1f;简单来说&#xff0c;EUDR是一张 “绿色通行证” 。它要求所有在欧盟市场销售七大类商品&#xff08;牛肉、木材、咖啡、可可、大豆、棕榈油、橡胶&#xff09;及衍生产品的企业&#xff0c;必须证明其产品…

作者头像 李华
网站建设 2026/4/15 12:11:45

26、端口敲门与单包授权:网络安全认证方法对比

端口敲门与单包授权:网络安全认证方法对比 1. 端口敲门技术基础 UDP 校验和伪造示例 在网络安全认证中,端口敲门是一种较为特殊的技术。我们可以通过执行特定脚本并使用以太网嗅探器观察 UDP 数据包来了解其部分特性。例如执行以下命令: # ./craft_udp_checksum.pl 192…

作者头像 李华
网站建设 2026/4/13 17:25:51

Java 线程池深度实战:从原理到高并发调优

一、引言&#xff1a;为什么线程池是并发编程的基石&#xff1f;在 Java 并发编程中&#xff0c;频繁创建与销毁线程会带来显著的性能损耗&#xff1a;线程的创建需要分配栈内存&#xff08;默认 1MB&#xff09;、初始化线程局部变量等资源&#xff0c;销毁时又需回收这些资源…

作者头像 李华