张量流中的一种热编码是什么?

数据挖掘 机器学习 Python 神经网络 深度学习 张量流
2021-09-22 03:06:27

我目前正在做一门 tensorflow 课程,他们在其中使用了 tf.one_hot(indices, depth)。现在我不明白这些索引是如何变成二进制序列的。

谁能给我解释一下具体过程???

2个回答

假设您的数据集中有一个分类特征(例如颜色)。您的样品可以是红色、黄色或蓝色。为了将此参数传递给 ML 算法,您首先需要对其进行编码,以便使用数字代替字符串。

做这种事情的最简单方法是创建一个映射,其中:

红色 --> 1
黄色 --> 2
蓝色 --> 3

并用其映射值替换每个字符串。

然而,这可能会在我们的 ML 模型中产生不必要的副作用,因为在处理数字时,它可能会认为蓝色 > 黄色(因为 3 > 2)或红色 + 黄色 = 蓝色(因为 1 + 2 = 3)。该模型无法知道这些数据是分类的,然后被映射为整数。

这个问题的解决方案是one-hot 编码,我们创建N个 新特征,其中N是原始特征中唯一值的数量。在我们的示例中, N等于 3,因为我们有 3 种独特的颜色(红色、黄色和蓝色)。

这些特征中的每一个都是二进制的,并且将对应于这些唯一值之一在我们的示例中,第一个特征将是一个二进制特征,告诉我们该样本是否为红色,第二个特征与黄色相同,第三个特征与蓝色相同。

这种转换的一个例子如下所示:

请注意,由于这种方法增加了数据集的维度,如果我们有一个具有许多唯一值的特征,我们可能希望使用更稀疏的编码(就像我上面介绍的那样)。

depth:定义一个热维度的深度的标量。

指数:指数的张量。

这是 tensorflow 文档中给出的示例。
1. 仅指定索引和深度(on_value 的默认值为 1,off_value 的默认值为 0)

 indices = [0, 1, 2]
    depth = 3
    tf.one_hot(indices, depth)  # output: [3 x 3]
    # [[1., 0., 0.],
    #  [0., 1., 0.],
    #  [0., 0., 1.]]
  1. 指定 on_value 和 off_value
指数 = [0, 2, -1, 1]
深度 = 3
tf.one_hot(索引,深度,on_value=5.0,off_value=0.0,axis=-1)
##输出:[4 x 3]
    # [[5.0, 0.0, 0.0], # one_hot(0)
    # [0.0, 0.0, 5.0], # one_hot(2)
    # [0.0, 0.0, 0.0], # one_hot(-1)
    # [0.0, 5.0, 0.0]] # one_hot(1)

也可以在 GitHub 上查看代码