tf.one_hot执行独热编码返回多数全0数组的问题咨询
问题成因
tf.one_hot()的编码规则非常直接:对输入的每个整数值i,生成长度为depth的向量,将向量第i个位置置为1,其余位置置为0;如果i超出[0, depth-1]的索引范围,直接返回全0向量。
你设置depth=10时,有效索引范围只有09,只有落在这个区间的输入值才能生成非零编码。但你生成的张量E取值范围是199,其中仅数值3落在有效区间内,因此只有对应编码行的第3位为1,其余48、85、75等所有大于9的数值都因为超出索引范围,被编码为全0向量。
另外你对独热编码接口的认知存在偏差:tf.one_hot不会自动识别不同取值、分配互不重复的编码,它只会严格把输入的整数值当做向量位置索引,不会自动做标签值的重映射。
修正方案
根据实际需求二选一即可:
- 如果你需要保留原始数值和编码位置的对应关系:将
depth设置为不小于「张量中最大值+1」的数值即可。你的示例张量最大值为96,设置depth=100就能覆盖所有取值:
tf.one_hot(E, depth=100)
注意这种方式如果原始数值跨度大,会生成维度极高的稀疏向量,算力浪费比较明显,仅适合标签本身从0开始连续编号的场景。
- 如果你只需要给所有不同取值分配互不重复的独热向量,不需要绑定原始数值:先将原始离散值映射为从0开始的连续整数ID,再执行独热编码即可,这也是分类任务中的常规做法:
# 将原始值映射为从0开始的连续类别ID _, mapped_ids = tf.unique(E) # 编码维度等于不同类别总数 result = tf.one_hot(mapped_ids, depth=tf.size(tf.unique(E)[0]))
内容的提问来源于stack exchange,提问作者Amish
相关产品推荐
相关产品推荐

