美文网首页
OneHot算法及在TensorFlow中的使用

OneHot算法及在TensorFlow中的使用

作者: 不ai吃糖 | 来源:发表于2019-10-12 17:57 被阅读0次

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)

相关文章

网友评论

      本文标题:OneHot算法及在TensorFlow中的使用

      本文链接:https://www.haomeiwen.com/subject/iqmxmctx.html