One-hot码指一定码长的二值码中,只有一位为1,其他全为0,比如00010000。这样,1所在的位数就可以作为有效的信息。One-hot码起源于数电中的状态机(State Machine),尤其是环形计数器,通过将信号1一直往下一位传递,表示不同的状态。与之相对的还有One-cold,只有一位为0,其他全为1。
在利用卷积神经网络进行图像分类时,由于图像的类别,亦即标签,往往用的是string这种数据类型,不便于比对和作为特征。所以我们要对这些标签进行编码,表示成一个向量,这个向量要便于分类。而One-hot码就是其中一种简单有效的编码方式。下面给出一份代码实例:
def one_hot(label):
"""
# 对标签label进行one-hot编码
:param label: 数据类型为list,元素为string
:return: onehot_label: 数据类型为list,元素为一维向量
"""
onehot_label = []
class_len = len(label) #分类类别
for i, c in enumerate(label):
vet = np.zeros(class_len)
vet[i] = 1
onehot_label.append(vet)
return onehot_label
label_ex = ['dog', 'cat', 'ox', 'fox', 'monkey', 'pig', 'elephant', 'sheep', 'lion', 'tiger']
label_de = one_hot(label_ex)
for c in label_de:
print(c)
而最后输出的结果为:
[ 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
现在,我们通过卷积神经网络获得了一个样本的输出特征,又该如何确定它属于哪一类呢?我们可以通过确定输出特征向量的最大值所在位置,来确定相应的one-hot标签,实现分类。