在TensorFlow中,函数'tf.one_hot'中的'axis'参数是什么?

时间:2018-01-03 18:11:50

标签: python-3.x tensorflow machine-learning multidimensional-array one-hot-encoding

任何人都可以帮助解释axis TensorFlow函数中one_hot的内容吗?

根据documentation

  

轴:要填充的轴(默认值:-1,新的最内轴)

最近,我在与SO was an explanation相关的Pandas上找到答案:

不确定上下文是否同样适用。

3 个答案:

答案 0 :(得分:8)

以下是一个例子:

x = tf.constant([0, 1, 2])

...是输入张量和N=4(每个索引都转换为4D向量)。

axis=-1

计算one_hot_1 = tf.one_hot(x, 4).eval()会产生(3, 4)张量:

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

...最后一个维度是一个热门编码(清晰可见)。这对应于默认axis=-1,即 last

axis=0

现在,计算one_hot_2 = tf.one_hot(x, 4, axis=0).eval()产生一个(4, 3)张量,这个张量不能立即识别为单热编码:

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

这是因为单热编码是沿着0轴完成的,并且必须转置矩阵以查看先前的编码。当输入更高维度时,情况变得更复杂,但想法是相同的:不同之处在于用于单热编码的额外维度的放置。

答案 1 :(得分:7)

对于我来说,轴转换为“在哪里添加额外的数字以增加尺寸”。至少这就是我如何解释它并作为助记符。

例如,你有[1,2,3,0,2,1],这是形状(6,1)。这意味着它是一维数组。 one_hot在原始数组的每个位置添加零并将位置转换为1,因为原始数组必须比原始数组多1个维度,并且轴告诉函数在哪里添加它,这个新维度将确定示例

轴线= 1

您添加第二个维度并保留第一个维度。这将导致(6,4)阵列。因此,对于生成的数组,您可以使用第一个维度(0)来了解您看到的示例,并使用第二个维度(1,新的维度)来了解该类是否处于活动状态。 newArr [0] [1] = 1表示示例0,类1,在这种情况下表示示例0属于类1.

   0   1   2   3  <- class

[[ 0.  1.  0.  0.]   <- example 0
 [ 0.  0.  1.  0.]   <- example 1
 [ 0.  0.  0.  1.]   <- example 2
 [ 1.  0.  0.  0.]   <- example 3
 [ 0.  0.  1.  0.]   <- example 4
 [ 0.  1.  0.  0.]]  <- example 5

轴= 0

添加第一个维度并移动现有维度。这将导致(4,6)阵列。因此,对于结果数组,您使用第一个维度(0,新维度)来了解该类是否处于活动状态,使用第二个维度(1)来了解您看到的示例。 newArr [0] [1] = 0表示0级,例1,在这种情况下,表示示例1不属于0级。

   0   1   2   3   4   5  <- example

[[ 0.  0.  0.  1.  0.  0.]   <- class 0
 [ 1.  0.  0.  0.  0.  1.]   <- class 1
 [ 0.  1.  0.  0.  1.  0.]   <- class 2
 [ 0.  0.  1.  0.  0.  0.]]  <- class 3

答案 2 :(得分:0)

对我来说,我是这样理解的—— (注意 documentation 中引用的索引只是类标签的信息,它可以是标量或向量或矩阵) 如果您的指数只是一个标量,则不需要轴。 然而,如果它是一个向量,你可以选择特征和类的方向 2` 在这里,one-hot 向量的图像有一行作为深度(类别)和一列作为各自的特征(标签),因此对于这种情况,轴的值为 0。 同样,如果您想要特征 x 深度,那么轴的值为 -1。

同样,如果索引是矩阵,那么您可以选择以下方向


(批处理表示索引中的行)3

batch x features x depth if axis == -1
batch x depth x features if axis == 1
depth x batch x features if axis == 0