onehot编码
本质上来讲是一个分类数据处理的方法,将每一个选项对应一串二进制编码。如下图所示:
而我们以手写训练集为例,手写训练集的总类别一共有十种,即输出节点为10,那么对于其中一个样本用布尔值0表示其不存在,用布尔值1表示其存在,这样对于1我们可以用一串二进制数据来表示:1000000000,同理二也可以用类似的形式表示:010000000。而对于tensorflow来说有一个封装好的方法可以直接实现one-hot编码:
y=tf.constant([1,2,3,4,5,6,7,8,9,0]) #数字编码的10个标签
y=tf.one_hot(y,depth=12) #one-hot编码,depth指的是one_hot编码的长度
输出结果:
tf.Tensor(
[[0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(10, 12), dtype=float32)
将depth=8:
y=tf.one_hot(y,depth=8)
输出结果:
tf.Tensor(
[[0. 1. 0. 0. 0. 0. 0. 0.]
[0. 0. 1. 0. 0. 0. 0. 0.]
[0. 0. 0. 1. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 0. 0. 0.]
[0. 0. 0. 0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0. 0. 1. 0.]
[0. 0. 0. 0. 0. 0. 0. 1.]
[0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0.]], shape=(10, 8), dtype=float32)
这里可以明显的看出如果depth小于图片的类数会明显的出现编码重复的问题(8的编码和9的编码重合),所以一般情况下depth一般设置为要分类的个数。
若不加depth参数:会报错