One-Hot 编码,又称为一位有效编码,主要是采用位状态寄存器来对个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
以郑板桥的《咏雪》举例,前两句诗共 14 个字,去掉重复有 11 个字以及 2 个标点组成,所以初始化用 13 个 0 表示:0 0 0 0 0 0 0 0 0 0 0 0 0
文字 + 标点 | one-hot 编码 |
---|---|
一 | 1 0 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 0 1 0 0 0 0 0 0 0 0 0 0 |
片 | 0 1 0 0 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 0 1 0 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 |
五 | 0 0 0 0 0 0 1 0 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 0 1 0 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 0 1 0 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 |
。 | 0 0 0 0 0 0 0 0 0 0 0 0 1 |
可以看到,所有片字都为:0 1 0 0 0 0 0 0 0 0 0 0 0,而且与其他汉字标点没什么关系,为相互独立的。
one-hot 编码表示共 4 个字符
import numpy as np
MAX_CAPTCHA = 4 # 最长4字符
CHAR_SET = '1234567890' # 验证码包括字符
CHAR_SET_LEN = len(CHAR_SET) # 包含字符数
def name2vec(name):
"""
文本换变成向量
:param name: 待输入的文本
:return: vector 文本对应的向量形式
"""
char_to_int = dict((c, i) for i, c in enumerate(CHAR_SET))
vector = np.zeros(MAX_CAPTCHA * CHAR_SET_LEN) # 生成一个一维向量
for index, item in enumerate(name):
idx = index * CHAR_SET_LEN + char_to_int[item]
vector[idx] = 1
return vector