Tensorflow之softmax多分类(顺序编码|独热编码)

一、前言

对数几率回归解决的是二分类的问题,但对于多个选项的问题,我们可以使用softmax函数
它是对数几率回归在N 个可能不同的值上的推广。

神经网络的原始输出并不是一个概率值,实质上只是对输入的数值做了加权与非线性处理之后的值而已,那么如何将输出转换为概率分布?这就引入了softmax层。

softmax激活要求每个样本必须属于某个类别,且所有可能的样本均被覆盖,softmax各样本分量之和为 1;当只有两个类别时,与对数几率回归(二分类)完全相同。

1、介绍一下下面实验需要用到的数据集Fashion MNIST,Fashion MNIST 比常规MNIST手写数据集更具挑战性。这两个数据集都相对较小,用于验证某个算法能否如期正常运行。它们都是测试和调试代码的良好起点。

2、描述一下label顺序编码与独热编码,Fashion MNIST数据集,顺序编码即为用0,1,2,\cdots ,9的不同数字来作为标签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个压缩文件,最后再次运行代码,就会很快就加载出来。

图1

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
图2

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所示,训练集损失与成功率的变化状况, 

图3

7、评估训练结果

val = model.evaluate(test_image,test_label)

如图3,即为测试集达到的正确率 

图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,预测结果正确

以上就是这部分学习,感谢关注与支持。

  • 51
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值