TensorFlow官方One Hot Encoding层输出形状异常问题咨询
问题根因
你遇到的输出合并问题并非教程代码有误,而是输入维度和CategoryEncoding层的默认行为不匹配导致的:
- TensorFlow的
CategoryEncoding层默认将1维输入(形状为(n,))识别为单个样本的多标签集合,输出为对应所有标签的multi-hot编码,形状为(num_tokens,),加上默认batch维度后就变成你看到的(1, num_tokens),多个标签位置都会被标记为1。 - 教程中的代码适配的是结构化数据的常规输入格式:每批次输入的单个特征列形状为
(batch_size, 1),即每个样本对应一个单独的类别值,此时输出自然为(batch_size, num_tokens)的独热编码。
排查方向
- 首先验证输入张量的形状:将你传入的字符串列表转换为Tensor后打印形状,如果输出为
(n,)就是维度不符合要求。 - 确认你使用的TensorFlow版本中
CategoryEncoding层的output_mode默认值,部分旧版本默认值为multi_hot,和预期的one_hot行为不一致。
修复方案
1. 调整输入维度
在输入编码层前给张量增加最后一维,将形状为(n,)的输入调整为(n, 1):
# 示例:输入为2个字符串的列表 input_list = ["class_a", "class_b"] input_tensor = tf.constant(input_list) # 增加维度,形状从(2,)变为(2,1) input_tensor = tf.expand_dims(input_tensor, axis=-1)
2. 显式指定编码层参数
修改函数中的CategoryEncoding初始化代码,显式声明output_mode='one_hot',避免版本兼容问题:
def get_category_encoding_layer(name, dataset, dtype, max_tokens=None): if dtype == 'string': index = preprocessing.StringLookup(max_tokens=max_tokens) else: index = preprocessing.IntegerLookup(max_tokens=max_tokens) feature_ds = dataset.map(lambda x, y: x[name]) index.adapt(feature_ds) # 显式指定output_mode为one_hot encoder = preprocessing.CategoryEncoding(num_tokens=index.vocabulary_size(), output_mode='one_hot') return lambda feature: encoder(index(feature))
修改后输入形状为(n,1)的张量,输出就会是预期的(n, 词汇表大小)的独热编码。
内容的提问来源于stack exchange,提问作者user1960089
相关产品推荐
相关产品推荐

