TextVectorization层不能直接fit原始字符串列表,因默认要求输入为tf.Tensor或np.ndarray且dtype为string;传入Python list会报TypeError,须用tf.constant()包装并提前dropna。

TextVectorization 层为什么不能直接 fit 到原始字符串列表
因为 TextVectorization 默认要求输入是 tf.Tensor 或 np.ndarray,且 dtype 必须为 string;传入 Python list(哪怕全是 str)会报 TypeError: Expected string, got list。
- 正确做法:用
tf.constant()包一层,比如tf.constant(["hello world", "goodbye"]) - 训练时别用
fit()传 pandas Series,先转成tf.constant(df["text"].tolist()) - 如果文本含 NaN,
tf.constant()会静默失败或报奇怪的 shape 错误——务必提前dropna()
如何控制词汇表大小和 OOV 行为
默认 max_tokens=None 会把所有词都塞进 vocab,导致向量维度爆炸;不设 oov_token 的话,未登录词直接被丢弃,模型收不到任何信号。
- 设
max_tokens=10000后,get_vocabulary()返回的 list 长度 ≤ 10000(含[UNK]) - 必须显式指定
oov_token="[UNK]",否则未登录词不会映射到固定 ID,而是被过滤掉 -
output_mode="int"时,输出是整数 ID 序列;选"count"或"tf_idf"会改变后续层输入形状,别混用
batch_size 和 sequence_length 怎么影响输出 shape
TextVectorization 本身不处理 batch,但你喂给它的数据 shape 决定了输出 shape;output_sequence_length 不是 padding 长度的“上限”,而是强制截断+补零后的**固定长度**。
- 输入是
["a b c", "x y"],设output_sequence_length=5→ 输出 shape 是(2, 5),不是(2, None) - 设
output_sequence_length=None时,输出是 ragged tensor,后续接 Dense 层会报错,必须先to_tensor() - 如果训练时设了
output_sequence_length=100,推理时输入超长文本会被无声截断——检查vocab里高频词是否被意外截掉
保存和重用 TextVectorization 层的坑
直接 model.save() 会存下 vocab,但加载后若没调用 adapt() 或没正确 restore,get_vocabulary() 可能返回空或默认值。
立即学习“Python免费学习笔记(深入)”;
- 推荐用
tf.keras.utils.get_file()+layer.set_weights()手动加载 vocab 文件 - 更稳的方式:把
vocab = layer.get_vocabulary()保存为文本,推理时用layer.set_vocabulary(vocab) - 注意 TF 版本差异:
TextVectorization在 TF 2.6+ 支持save_format="h5",但 TF 2.9+ 默认只认"tf"格式,老代码加载会失败
真正麻烦的是跨环境 vocab 对齐——训练机和部署机的 Unicode 处理(如 emoji、全角空格)稍有不同,get_vocabulary() 就可能不一致。别依赖“看起来一样”,要校验 hash。


















