零基础吃透:不规则维度 vs 均匀维度(RaggedTensor核心概念)
这份内容会把「不规则维度、均匀维度」以及 RaggedTensor 形状相关的核心概念,用通俗比喻+实例拆解讲清楚,帮你彻底理解 RaggedTensor 的维度规则和形状表示。
一、核心定义:不规则维度 vs 均匀维度(先认清楚)
维度的"规则/不规则",本质是「该维度下的所有切片长度是否一致」------可以用"切蛋糕"比喻理解:
- 把张量想象成一块蛋糕,"维度"就是切蛋糕的方向(比如先横切、再竖切);
- "切片"就是某一个方向下切出来的小块;
- 若同一方向的所有小块大小(长度)都一样 → 均匀维度;若不一样 → 不规则维度。
1. 均匀维度(Uniform Dimension)
✅ 定义:该维度下的所有切片长度完全相同 (切出来的小块大小都一样)。
✅ 例子:
普通张量 [[1,2],[3,4],[5,6]] 的两个维度都是均匀的:
- 维度0(行方向):3个切片(3行),每个切片长度都是2(列数);
- 维度1(列方向):2个切片(2列),每个切片长度都是3(行数)。
2. 不规则维度(Ragged Dimension)
❌ 定义:该维度下的切片长度各不相同 (切出来的小块大小不一样)。
❌ 核心例子(文档原版):
python
rt = tf.ragged.constant([[3, 1, 4, 1], [], [5, 9, 2], [6], []])
- 维度0(最外层,行方向):5个切片(5行),这是均匀维度(因为"有5行"这个数量是固定的,切片数固定=5);
- 维度1(内层,列方向):每个行切片的长度分别是4、0、3、1、0 → 长度不一致 → 这是不规则维度。
关键对比表
| 维度类型 | 核心特征 | 通俗例子 |
|---|---|---|
| 均匀维度 | 同维度下所有切片长度相同 | 全班50个学生,每人都有3支笔 |
| 不规则维度 | 同维度下切片长度不同 | 全班50个学生,有人有2支笔、有人有5支、有人0支 |
二、RaggedTensor 的维度规则(必记!)
规则1:最外层维度永远是均匀维度
✅ 原因:最外层维度的"切片"只有1个(就是整个张量本身),"只有1个切片"就不存在"长度不同"的可能,因此必然是均匀的。
✅ 例子验证:
- 文档里的
rt = [[3,1,4,1], [], [5,9,2], [6], []]:最外层维度长度=5(5行),是固定值 → 均匀; - 句子嵌入张量
[num_sentences, (num_words), embedding_size]:最外层num_sentences(句子数)是固定值(比如3个句子)→ 均匀。
规则2:除最外层外,其余维度可规则/可不规则
RaggedTensor 支持"混合维度"(部分均匀、部分不规则),也支持"多个不规则维度":
场景1:混合维度(1个不规则 + 2个均匀)
✅ 例子:句子单词嵌入张量 [num_sentences, (num_words), embedding_size]
- 维度0(num_sentences):均匀(比如3个句子,数量固定);
- 维度1(num_words):不规则(每个句子的单词数不同);
- 维度2(embedding_size):均匀(每个单词的嵌入向量都是4维,维度固定)。
场景2:多个不规则维度
✅ 例子:结构化文本文档张量 [num_documents, (num_paragraphs), (num_sentences), (num_words)]
- 维度0(num_documents):均匀(比如2篇文档,数量固定);
- 维度1(num_paragraphs):不规则(每篇文档的段落数不同);
- 维度2(num_sentences):不规则(每个段落的句子数不同);
- 维度3(num_words):不规则(每个句子的单词数不同)。
补充:RaggedTensor 的"秩"(总维数)
和普通 tf.Tensor 一样,RaggedTensor 的秩 = 总维度数(不管是均匀还是不规则维度,都算一个维度):
- 例子1:
[[Hi], [How,are,you]]→ 秩=2(2个维度:行+列); - 例子2:文档张量
[num_documents, (num_paragraphs), (num_sentences), (num_words)]→ 秩=4(4个维度)。
三、RaggedTensor 的形状表示(3种方式)
描述 RaggedTensor 形状时,有3种核心方式,重点区分「逻辑形状」「shape属性」「bounding_shape」:
方式1:惯例写法(逻辑形状)------ 括号标不规则维度
✅ 规则:用 () 把不规则维度的名称括起来,直观区分规则/不规则;
✅ 例子:
- 句子张量
[[Hi], [How,are,you]]→ 逻辑形状[2, (3)](2是均匀维度,3是不规则维度的最长长度); - 单词嵌入张量 → 逻辑形状
[num_sentences, (num_words), embedding_size]。
方式2:RaggedTensor.shape 属性 ------ 不规则维度用 None 表示
✅ 规则:返回 tf.TensorShape 对象,均匀维度显示具体长度,不规则维度显示 None (因为长度不固定);
✅ 例子(文档原版):
python
rt = tf.ragged.constant([["Hi"], ["How", "are", "you"]])
print(rt.shape) # 输出:TensorShape([2, None])
- 解释:维度0(行)长度=2(均匀)→ 显示2;维度1(列)不规则 → 显示None。
方式3:bounding_shape() 方法 ------ 紧密边界形状(补到最长长度)
✅ 规则:返回"把所有不规则维度补到该维度最长长度"后的形状(即"如果把 RaggedTensor 转成普通张量,需要补0到多大");
✅ 例子(文档原版):
python
rt = tf.ragged.constant([["Hi"], ["How", "are", "you"]])
print(rt.bounding_shape()) # 输出:tf.Tensor([2 3], shape=(2,), dtype=int64)
- 解释:维度0长度=2(不变),维度1的最长长度=3(第二个句子有3个词)→ 边界形状是 [2,3]。
三种形状表示对比表
| 表示方式 | 例子([[Hi], [How,are,you]]) | 核心含义 |
|---|---|---|
| 惯例写法(逻辑) | [2, (3)] | 直观标不规则维度 |
rt.shape |
TensorShape([2, None]) | 不规则维度用None标记 |
rt.bounding_shape() |
[2, 3] | 补0后的最小普通张量形状 |
四、核心总结(避坑关键点)
- 维度的"规则/不规则"看「同维度下切片长度是否一致」,和"是不是最外层"无关;
- RaggedTensor 最外层必是均匀维度(只有1个切片,无长度差异),内层可规则/可不规则;
- 形状表示:
- 逻辑写法:括号标不规则维度;
shape属性:None 代表不规则维度;bounding_shape:不规则维度取最长长度,得到"最小普通张量形状";
- 秩(总维数):不管规则/不规则,有几个维度就是几秩(和普通张量一致)。
小练习(验证理解)
已知 RaggedTensor:rt = tf.ragged.constant([[[1,2], [3]], [[4,5,6]]])
- 维度0(最外层):长度=2 → 均匀维度;
- 维度1(中层):切片长度=2、1 → 不规则维度;
- 维度2(内层):切片长度=2、1、3 → 不规则维度;
rt.shape→ TensorShape([2, None, None]);rt.bounding_shape()→ [2, 2, 3]。
如果能答对,说明核心概念已经吃透了~