查看原文
其他

详解深度学习中的独热编码

OpenCV使者 OpenCV学堂 2019-03-29

 

很多人开始接触深度学习,数据处理遇到第一个专业英文术语就是one-hot encode(独热编码),很多初学者就会迷茫,这个东西是什么意思,其实说的直白点所谓的独热编码最重要的就是把一组字符串或者数字转为一组向量而且这组向量中只能有一个向量值是1。可见独热编码还是很形象的说1这个单独大热门,做个形象的比喻,2018足球世界杯的冠军只能有一个,如果对32支球队做个独热编码则会得到32个向量,其中只能有一支球队对应的向量是1,表示这届的冠军就是它啦,其它都只能是零,得回家。对以往各届参赛球队做独热编码就可以得到每届结果,然后根据以往各支球队综合表现生成一系列的向量,就可以训练生成模型,根据本届各队综合表现参数,就可以预测本届冠军啦,这里独热编码生成的向量可以作为标签,这个也是独热编码最常用的方式与场景。在tensorflow的官方mnist数据集例子中也是采用独热编码来做标签数据,训练实现手写数字识别的。说了这么多独热编码的解释与概念,下面就来看看独热编码详细解释,只需四步,保证你理解独热编码,而且会做啦。

独热编码的定义

根据同一类别的数据生成一组二值向量, 类别数据中期待的对应二值向量为1,其余为零。

举例说明

假设我们要预测鸢尾花种类,已知有三种分别为山鸢尾、变色鸢尾、维吉尼亚鸢尾。根据给定的一组鸢尾花的数据,我们可以预测其种类是哪一种,对训练数据编码:

山鸢尾变色鸢尾维吉尼亚鸢尾
100

最终向量为1 0 0 表示种类是山鸢尾

山鸢尾变色鸢尾维吉尼亚鸢尾
010

最终向量为0 1 0 表示种类是变色鸢尾

山鸢尾变色鸢尾维吉尼亚鸢尾
001

最终向量为0 0 1 表示种类是维吉尼亚鸢尾

为什么要使用独热编码,原因如下

独热编码可以很好的表示分类数据的,而许多机器学习与深度学习的任务就是实现各种回归模型分类任务,而且独热编码非常容易实现,无需复杂计算,只有整数0、1的二进制表达容易被技术与工程人员理解与接受。

独热编码的代码演示

  • 手动版

  1. from numpy import argmax

  2. # define input string

  3. data = 'hello world'

  4. print(data)

  5. # define universe of possible input values

  6. alphabet = 'abcdefghijklmnopqrstuvwxyz '

  7. # define a mapping of chars to integers

  8. char_to_int = dict((c, i) for i, c in enumerate(alphabet))

  9. int_to_char = dict((i, c) for i, c in enumerate(alphabet))

  10. # integer encode input data

  11. integer_encoded = [char_to_int[char] for char in data]

  12. print(integer_encoded)

  13. # one hot encode

  14. onehot_encoded = list()

  15. for value in integer_encoded:

  16.    letter = [0 for _ in range(len(alphabet))]

  17.    letter[value] = 1

  18.    onehot_encoded.append(letter)

  19. print(onehot_encoded)

  20. # invert encoding

  21. inverted = int_to_char[argmax(onehot_encoded[0])]

  22. print(inverted)

  • keras版本

  1. from numpy import array

  2. from numpy import argmax

  3. from keras.utils import to_categorical

  4. # define example

  5. data = [1, 3, 2, 0, 3, 2, 2, 1, 0, 1]

  6. data = array(data)

  7. print(data)

  8. # one hot encode

  9. encoded = to_categorical(data)

  10. print(encoded)

  11. # invert encoding

  12. inverted = argmax(encoded[0])

  13. print(inverted)

参考引用

https://machinelearningmastery.com/how-to-one-hot-encode-sequence-data-in-python/

更多相关阅读

如何学习计算机视觉OpenCV

OpenCV实现0到9数字识别OCR

TensorFlow中常量与变量的基本操作演示

TensorFlow中的feed与fetch

TensorFlow进行简单的图像处理

基于OpenCV实现手写体数字训练与识别

OpenCV学堂-原创精华文章



知不足者好学

耻下问者自满

关注【OpenCV学堂】

长按或者扫码二维码即可关注

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存