What
One Hot,即用N位状态寄存器编码N个状态,每个状态都有独立的寄存器位,且这些寄存器位中只有一位有效,说白了就是只能有一个状态。
先举个例子,有3个状态,根据“用N位0状状态寄存器编码N个状态”,则对应的状态为:
0:[1,0,0]
1:[0,1,0]
2:[0,0,1]
当不在三个状态内时:[0,0,0]
其中1表示有效位,0表示无效位,其实也可以用任意数据表示有效位和无效位,比如,还是3个状态,用22表示有效位,99表示无效位,则对一组数据[2,1,0,3],进行编码的结果为:
[99,99,22],[99,22,99],[22,99,22],[99,99,99]
Why
OneHot是一种编码方式,通过上面的例子可以看出,该编码方式只有两个值,因此是一种将原数值进行二值化的操作。
在分类问题中,直接的类别标签放在欧式空间进行距离度量并不合理。还以上面的例子为例,3状态即为三个类别标签:0,1,2,直接计算欧式距离则0和1的距离为1,0和2的距离为2,不满足距离度量的特性。引入OneHot编码,转换为三个向量,此时计算距离都为sqrt(2)。
How
TensorFlow中的OneHot编码,算子在array_ops中
one_hot(indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None)
indices,索引位置,在对应的索引位置设置on_value,其余位置设置off_value;
depth表示的是类别;
on_value和off_valued的数据类型有后面的dtype决定,默认值为1和0,数据类型默认为float32;
axis是决定按哪个轴进行扩充,默认为-1,假设输入的indices是个向量,元素个数设为feature,则输出的矩阵的维度会按照如下的规则:
features x depth if axis == -1
depth x features if axis == 0
如果indices是个矩阵,大小为[batch, features],则输出的矩阵维度为:
batch x features x depth if axis == -1
batch x depth x features if axis == 1
depth x batch x features if axis == 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.]]
indices = [0, 2, -1, 1]
depth =3
tf.one_hot(indices, depth,
on_value=5.0, off_value=0.0,
axis=-1)# output: [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)
indices = [[0, 2], [1, -1]]
depth =3
tf.one_hot(indices, depth,
on_value=1.0, off_value=0.0,
axis=-1)# output: [2 x 2 x 3]
# [[[1.0, 0.0, 0.0], # one_hot(0)
# [0.0, 0.0, 1.0]], # one_hot(2)
# [[0.0, 1.0, 0.0], # one_hot(1)
# [0.0, 0.0, 0.0]]] # one_hot(-1)
网友评论