在tf.keras中,对于分类问题中,多使用categorical_crossentropy和sparse_categorical_crossentropy来计算softmax来计算交叉熵。在上一节案例中,便签是数字序号编码,使用的是categorical_crossentropy。那么,什么是独热编码呢?这两种有什么区别呢?

上一节的案例中,label是数字序号编码,那么就使用sparse_categorical_crossentropy来进行计算。数字序号编码就是指用数字进行分类是,例如用0表示鞋子,1表示帽子,2表示袜子,3表示裤子等等。

基于Fashion MNIST数据集的softmax函数多分类以及代码实现,在这篇文章里,Fashion MNIST数据集就是使用的数字序号编码。

数字编码

如果使用独热编码,则使用categorical_crossentropy来计算交叉熵。那么什么是独热编码呢?

独热编码的基本概念

独热编码(One-Hot Encoding),又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码。这里举几个例子就能很快明白什么是独热编码了:

性别特征:["男","女"](这里N=2 二维数据)
男 => 10
女 => 01

地区特征:["北京","上海,"深圳"](这里N=3,三维数据):
北京 => 100
上海 => 010
深圳 => 001

工作特征:["演员","厨师","公务员","工程师","律师"](这里N=5,五维数据):
演员 => 10000
老师 => 01000
公务员 => 00100
工程师 => 00010
消防员 => 00001

样本A的特征是["女","北京","工程师"]的时候,独热编码(One-Hot Encoding)的结果为:

[0,1,1,0,0,0,0,0,1,0]

在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的。而常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。使用独热编码(One-Hot Encoding),将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用独热编码(One-Hot Encoding),会让特征之间的距离计算更加合理。

独热编码的优点为:

1.能够处理非连续型数值特征。
2.在一定程度上也扩充了特征。比如性别本身是一个特征,经过one hot编码以后,就变成了男或女两个特征。

但是特征类别较多时,数据经过独热编码可能会变得过于稀疏。

数字序号编码转换为独热编码

TensorFlow中,转换起来是非常的容易,一句话就能解决,例如:

train_label_onehot = tf.keras.utils.to_categorical(train_label)

测试变换后的独热编码

数字序号编码的时候,5,转换为独热编码就是[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.]。

基于Fashion MNIST数据集的独热编码训练

import tensorflow as tf
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 加载Fashion MNIST数据
(train_image, train_label),(test_image, test_label) = tf.keras.datasets.fashion_mnist.load_data()

# 将数字序号编码转换为独热编码
train_label_onehot = tf.keras.utils.to_categorical(train_label)
test_label_onehot = tf.keras.utils.to_categorical(test_label)

# 对于图片数据,进行归一化处理
train_image = train_image/255
test_image = test_image/255

# 神经网络模型的建立
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))        #输入层,把图像扁平成28*28的向量
model.add(tf.keras.layers.Dense(128, activation='relu'))      # 添加隐藏层
model.add(tf.keras.layers.Dense(10, activation='softmax'))    # 输出十个概率值,softmax概率分布

# 编译
model.compile(optimizer='adam',
              loss='categorical_crossentropy',   #输入数据的类别标签采用独热编码
              metrics = ['acc']
)

# 模型进行训练
model.fit(train_image, train_label_onehot, epochs=5) 

# 用test_image进行预测
predict = model.predict(test_image)

print(predict[0])  # 所有分量之和为1
print(np.argmax(predict[0]))
print(test_label[0])

由于我是用notebook进行测试的,所以在这展示一下相关的测试过程以及运行结果:

对正确率的影响

模型训练后的预测


参考资料:

独热编码(One-Hot Encoding)


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/onehot.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 09 月 11 日
如果觉得我的文章对你有用,请随意赞赏