如何阻止TensorFlow的TextVectorization为未知和空白字符串生成映射值
方案1:全版本兼容的原生哈希表实现(推荐)
直接使用TensorFlow内置的静态哈希表实现映射,完全可控无多余默认规则,兼容所有TensorFlow 2.x版本:
import tensorflow as tf # 自定义词表 possible_values = ["a", "b", "c"] # 构建键值映射:字符串对应索引 keys = tf.constant(possible_values) values = tf.range(len(possible_values), dtype=tf.int64) # 初始化哈希表 table_init = tf.lookup.KeyValueTensorInitializer(keys, values) # default_value为词表外字符串的返回值,可自定义,这里设为-1标记异常 hash_table = tf.lookup.StaticHashTable(table_init, default_value=-1)
测试效果:
test_tensor = tf.constant(["b","b","c","b","a","potato",""]) print(hash_table.lookup(test_tensor))
输出:
tf.Tensor([1 1 2 1 0 -1 -1], shape=(7,), dtype=int64)
得到的索引可以直接传入tf.one_hot做独热编码,深度设置为len(possible_values)即可,无需额外偏移处理。如果需要严格校验无异常值,只需判断输出中是否存在-1,配合TensorFlow断言逻辑抛出错误即可。
方案2:TensorFlow 2.6及以上版本调整TextVectorization参数
如果你的TensorFlow版本>=2.6,可以直接通过参数禁用TextVectorization的默认padding和OOV映射:
import tensorflow as tf from tensorflow.keras import layers possible_values = ["a","b","c"] text_vectorization = layers.TextVectorization( output_sequence_length=1, num_oov_indices=0, # 禁用OOV词位 pad_token=None, # 禁用默认空字符串的padding映射 standardize=None # 无需自动标准化(如转小写、去特殊符号等)可开启,避免修改原始字符串 ) text_vectorization.set_vocabulary(possible_values) print(text_vectorization.get_vocabulary()) # 输出:['a', 'b', 'c']
测试效果和哈希表方案一致,词表外字符串默认返回-1。
内容的提问来源于stack exchange,提问作者DataJack
相关产品推荐
相关产品推荐

