目录
二、softmax多分类代码实现Fashion MNIST数据集(label顺序编码)
三、softmax多分类代码实现Fashion MNIST数据集(label为独热编码)
一、前言
对数几率回归解决的是二分类的问题,但对于多个选项的问题,我们可以使用softmax函数
它是对数几率回归在N 个可能不同的值上的推广。
神经网络的原始输出并不是一个概率值,实质上只是对输入的数值做了加权与非线性处理之后的值而已,那么如何将输出转换为概率分布?这就引入了softmax层。
softmax激活要求每个样本必须属于某个类别,且所有可能的样本均被覆盖,softmax各样本分量之和为 1;当只有两个类别时,与对数几率回归(二分类)完全相同。
1、介绍一下下面实验需要用到的数据集Fashion MNIST,Fashion MNIST 比常规MNIST手写数据集更具挑战性。这两个数据集都相对较小,用于验证某个算法能否如期正常运行。它们都是测试和调试代码的良好起点。
2、描述一下label顺序编码与独热编码,Fashion MNIST数据集,顺序编码即为用的不同数字来作为标签label,用于表示数据集中不同的物体,比如鞋子可用9表示;而独热编码则是用一个序列表示,比如一共有三个实体,分别为衣服,鞋子,裤子,则用[1,0,0]表示衣服,用[0,1,0]表示鞋子,用[0,0,1]表示裤子,即在表示第i个物体时仅有第i个不为0,其余均为0,且他们的概率和为1。顺序编码与独热编码相同点就是他们的样本概率和均为1。
二、softmax多分类代码实现Fashion MNIST数据集(label顺序编码)
Fashion MNIST 数据集包含70000 张灰度图像,涵盖10 个类别。我们将使用60000 张图像训练网络,并使用10000 张图像评估经过学习的网络分类图像的准确率。可以从TensorFlow 直接访问Fashion MNIST,只需导入和加载数据即可。
1、导入库
import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
2、加载fashion_minst数据集
(train_image,train_label),(test_image,test_label) = tf.keras.datasets.fashion_mnist.load_data() #加载fashion_minst数据集直接到训练集以及测试集
但存在一个问题,若第一次使用,是从国外的官网下载,比较慢,也容易出现问题,我是从gitee上面下载的,为了方便,我将 Fashion MNIST数据集连接放在这https://gitee.com/onlypersonCHEN/fashion-mnist。
在这里描述一下,运行完加载Fashion MNIST数据集代码后,一般都会报错,我们只需要将下载的文件放到目录C:\Users\自己用户\.keras\datasets\fashion-mnist下即可,主要就是图1中的4个压缩文件,最后再次运行代码,就会很快就加载出来。

3、前序数据集的了解以及归一化处理
#查看数据形状
train_image.shape#60000,28*28的图片
train_label.shape#60000个标签
test_image.shape,test_label.image#10000个28*28的图片及10000个标签
plt.imshow(train_image[0])#训练集第一张图片为一张鞋子图,如图2所示
train_image[0]#查看取值
np.max(train_image[0])#查看最大取值为255,所以取值为0-255
train_label #运行结果为array([9, 0, 0, ..., 3, 0, 5], dtype=uint8),是使用顺序的数值来标明物体。
test_label
#归一化,神经网络擅长一个固定的输入值,将输入数据归一化到[0,1]之间,这也是前面需要查看取值的原因
train_image = train_image/255
test_image = test_image/255

4、构建模型
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')) #一个隐藏层,Dense只能处理一维数据128个神经元
model.add(tf.keras.layers.Dense(10,activation = 'softmax'))#把这10个输出变为概率值,使用softmax激活,这10个概率值和为1
5、编译模型
model.compile(optimizer = 'adam', #梯度下降优化
loss = 'sparse_categorical_crossentropy', #数字编码,使用此函数计算交叉熵
metrics = ['acc']
)
6、训练模型
history = model.fit(train_image,train_label,epochs = 10) #训练模型100次
history.history.keys() #显示histoory中内容,包括loss与acc
# 1、创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 2、绘制图像
plt.plot(history.epoch,history.history.get('loss'), color="r", linestyle="-.", label="loss")
plt.plot(history.epoch,history.history.get('acc'), color="b", label="acc")
# 3、显示图例,这里显示图例的前提是plt.plot时要添加标签label=“”
plt.legend()#legend有自己的参数可以控制图例位置
# 4、添加网格显示,其中的alpha是网格的透明程度
plt.grid(linestyle="--", alpha=0.5)
# 5、添加描述信息
plt.xlabel("训练次数")
plt.ylabel("loss与acc变化")
plt.title("训练集损失与成功率变化状况")
# 6、显示图
#plt.show()
如图3所示,训练集损失与成功率的变化状况,

7、评估训练结果
val = model.evaluate(test_image,test_label)
如图3,即为测试集达到的正确率

三、softmax多分类代码实现Fashion MNIST数据集(label为独热编码)
label采用独热编码时,对于前四个步骤导入库,导入数据集,归一化处理和构建模型与顺序编码相同,不同的是在编译之后的操作以及我们需要将label编码由顺序编码改为独热编码,步骤如下:
train_label #查看训练集顺序编码
train_label_onehot = tf.keras.utils.to_categorical(train_label)#将顺序编码转化为独热编码
train_label_onehot[0] #顺序编码9变化为独热编码array([0., 0., 0., 0., 0., 0., 0., 0., 0., 1.], dtype=float32)
#训练集
test_label
test_label_onehot = tf.keras.utils.to_categorical(test_label)
test_label_onehot[0]
1、编译
model.compile(optimizer = 'adam',
loss = 'categorical_crossentropy',#独热编码使用此函数计算softmax交叉熵
metrics = ['acc']
)
2、训练模型
history = model.fit(train_image,train_label_onehot,epochs = 10)
3、预测模型并对比
test_image.shape #原本测试集形状,10000个28*28的样本
predict = model.predict(test_image) #预测
predict.shape #预测形状10000个长度为10的向量,代表分类结果
predict[0] #查看预测的第一个,里面某个值最大即为我们要预测的值
np.argmax(predict[0])#取最大值
test_label[0]#与原本测试标签一样,输出结果均为9,预测结果正确