这是一个例子:
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
,即最后一个维度。
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.]]
这是因为one-hot编码沿着0轴完成,必须转置矩阵才能看到先前的编码。当输入维度更高时,情况变得更加复杂,但是思想是相同的:区别在于用于one-hot编码的额外维度的放置。
对我来说,轴的意思是“你在哪里添加附加数字以增加维度”。至少这是我的解释,并且作为一种记忆提示。
例如,您有 [1,2,3,0,2,1],它的形状为 (1,6)。这意味着它是一个一维数组。one_hot 添加零,并将原始数组中的位置转换为 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 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
(批处理是您索引中的行)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
x = tf.constant([[1, 1, 2], [0, 1, 2]])
会产生一个4D
向量的呢?...是因为它是由两个二维数组作为元素组成的数组吗? - tinoneticx = tf.constant([0, 1, 2])
看到差异:结果要么是(3, 4)
要么是(4, 3)
。 - Maxim