如何使用 tf.one_hot 计算一种热编码?

Posted

技术标签:

【中文标题】如何使用 tf.one_hot 计算一种热编码?【英文标题】:How do I compute one hot encoding using tf.one_hot? 【发布时间】:2019-11-03 19:32:25 【问题描述】:

我正在尝试使用 tensorflowmnist 数据集的 y_train 构建一个热编码。我不明白怎么做?

# unique values 0 - 9
y_train = array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)

keras 我们会做类似的事情

# this converts it into one hot encoding
one hot_encoding = tf.keras.utils.to_categorical(y_train)

tf.one_hot 中,我对indicesdepth 参数的输入应该是什么?进行一次热编码后,如何将其从 2d-tensor 转换回 numpy 数组?

【问题讨论】:

【参考方案1】:

我对 Tensorflow 不熟悉,但经过一些测试,这是我发现的:

tf.one_hot() 采用 indicesdepthindices 是实际转换为 one-hot 编码的值。 depth 指的是要使用的最大值。

以如下代码为例:

y = [1, 2, 3, 2, 1]
tf.keras.utils.to_categorical(y)
sess = tf.Session();
with sess.as_default():
    print(tf.one_hot(y, 2).eval())
    print(tf.one_hot(y, 4).eval())
    print(tf.one_hot(y, 6).eval())

tf.keras.utils.to_categorical(y) 返回以下内容:

array([[0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.],
       [0., 0., 1., 0.],
       [0., 1., 0., 0.]], dtype=float32)

相比之下,tf.one_hot() 选项(2、4 和 6)执行以下操作:

[[0. 1.]
 [0. 0.]
 [0. 0.]
 [0. 0.]
 [0. 1.]]
[[0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]
 [0. 0. 1. 0.]
 [0. 1. 0. 0.]]
[[0. 1. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0.]
 [0. 0. 1. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0.]]

从这里可以看出,要使用tf.one_hot() 模拟tf.keras.utils.to_categorical()depth 参数应该等于数组中存在的最大值,+1 表示 0。在这种情况下,最大值为 3 ,因此编码中有四个可能的值 - 0、1、2 和 3。因此,在 one-hot 编码中表示所有这些值需要 4 的深度。

至于转换为 numpy,如上所示,使用 Tensorflow 会话,在张量上运行 eval() 会将其转换为 numpy 数组。具体方法请参考How can I convert a tensor into a numpy array in TensorFlow?。

我不熟悉 Tensorflow,但我希望这会有所帮助。

注意:对于 MNIST,深度为 10 就足够了。

【讨论】:

【参考方案2】:

我想反驳@Andrew Fan 所说的话。首先,上面的 y 标签列表不是从索引 0 开始的,这是需要的。只需查看所有这些示例中的第一列(即索引 0):它们都是空的。这将在学习中创建一个冗余类,并可能导致问题。一个热创建一个简单的列表,该索引位置为 1,其他位置为 0。因此,您的深度必须与类数相同,但您也必须从索引 0 开始。

【讨论】:

以上是关于如何使用 tf.one_hot 计算一种热编码?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 和 Scikit 进行线性回归学习使用一种热编码?

使用 scikit 学习的一种热编码和熊猫

机器学习:如何在具有分类和数字特征的 pandas 数据帧上应用一种热编码?

logit 和 sklearn 管道的一种热编码

使用 numpy 的一种热编码 [重复]

大型数据集的一种热编码