任何人都可以帮助解释axis
TensorFlow
函数中one_hot
的内容吗?
轴:要填充的轴(默认值:-1,新的最内轴)
最近,我在与SO was an explanation相关的Pandas上找到答案:
不确定上下文是否同样适用。
答案 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个维度,并且轴告诉函数在哪里添加它,这个新维度将确定示例。
您添加第二个维度并保留第一个维度。这将导致(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
添加第一个维度并移动现有维度。这将导致(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