tf.keras.layers.TextVectorization从保存配置重建后输出序列长度异常问题
异常原因说明
- 该问题是TensorFlow 2.4~2.7版本的已知实现缺陷,核心诱因是
TextVectorization.get_config()返回的output_mode字段并非原生Python字符串,而是Keras内部定义的枚举类型实例。 - 代码中
from_disk['config']['output_mode'] == 'int'返回True,是因为该枚举类重写了相等判断方法,但TextVectorization的初始化逻辑有严格的类型校验:只有当output_mode传入**原生字符串'int'**时,才会触发output_sequence_length对应的填充/截断逻辑;传入枚举类型的'int'时,内部判断分支未匹配到对应模式,自动忽略了output_sequence_length参数,只会输出原始分词长度的序列。 - 硬编码传入
output_mode='int'时,参数是原生字符串,能被逻辑正确识别,因此padding规则正常生效。
修复方案
你可以选择以下任意一种方式解决该问题:
- 加载配置时强制转换
output_mode为字符串类型:
new_v1 = tf.keras.layers.TextVectorization( max_tokens=None, standardize="lower_and_strip_punctuation", split="whitespace", output_mode=str(from_disk['config']['output_mode']), output_sequence_length=from_disk['config']['output_sequence_length'], )
- 直接调用官方提供的
from_config方法加载配置,内部会自动处理类型匹配问题,无需手动传参:
new_v1 = tf.keras.layers.TextVectorization.from_config(from_disk['config']) new_v1.set_weights(from_disk['weights']) # TensorFlow 2.6及以上版本使用该方法加载,无需额外调用dummy adapt
内容的提问来源于stack exchange,提问作者lankuohsing
相关产品推荐
相关产品推荐

