tensorflow2.0 入门学习——tf.keras实现softmax多分类与独热编码处理

tensorflow2.0 入门学习——tf.keras实现softmax多分类与独热编码处理

一、 简介:

  1. 对数机率回归解决的是二分类的问题,而对于多个选项的问题采用softmax函数,它是对数几率回归在N个可能不同的值上的推广。神经网络的原始输出并不是一个概率值,实际上只是输入的数值做了复杂的加权和非线性处理之后的一个值而已,Softmax层的作用就是将这个值变为概率分布输出。
  2. 在tf.keras中,对于多分类问题使用:
    categorical_crossentropy和sparse_categorical_crossentropy来计算softmax交叉熵。
    用数字作为标签时用 sparse_categorical_crossentropy
    用独热编码形式时用 categorical_crossentropy

二、 实操:
数据集介绍 :Fashion MNIST 数据集,是tensorflow中内置的数据集,其中包含各种服饰图像。
在这里插入图片描述
数据集中一共包含7万张服饰灰度图片,选用6万张训练网络,1万张评估模型。

代码:

  1. Fashion MNIST 数据集的导入
import tensorflow as tf
#直接加载tensorflow中内置的数据集,第一次需要先下载
fashion_mnist = tf.keras.datasets.fashion_mnist.load_data()
# 返回一个已经划分好训练/测试数据的元组

第一次下载时,会自动在.keras 文件中新建datasets目录,并从网站下载数据集。若之前已下载好,可以直接将文件copy到.keras/datasets 目录中
在这里插入图片描述

#fashion_mnist = (([训练图片],[训练标签])),([测试图片],[测试标签]))
train_image = fashion_mnist[0][0]    
train_label = fashion_mnist[0][1]
test_image = fashion_mnist[1][0]
test_label = fashion_mnist[1][1]

在这里插入图片描述
可以看出训练数据6万张训练数据,1万张测试数据。

  1. 用plt显示图片
import matplotlib.pyplot as plt
# 显示一下第一张图片和对应的标签
plt.imshow(train_image[0])
train_label[0]

在这里插入图片描述

  1. 数据的归一化处理:
    对神经网络来说比较擅长处理小范围的数据,所以将图片中 0~255 的数据
    归一化为0~1之间。对图片来说比较好处理,只需除255即可
# 图片数据作归一化处理
train_image = train_image/255   
test_image = test_image/255

归一化后图片数据:
在这里插入图片描述

  1. 建立模型
# 构建序列模型
model = tf.keras.Sequential()
# 添加各层
    #第二层(展平层):将二维图片数据展平开,只需指定输入数据的维度,其单元个数会自动计算
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
    #第三层(隐藏层):自定义128个单元个数,用relu函数激活
model.add(tf.keras.layers.Dense(128,activation="relu"))
    #第四层(输出层):输出各个服饰类别,因为有10个类别所以单元个数为10,用softmax
model.add(tf.keras.layers.Dense(10,activation="softmax"))
print(model.summary())

在这里插入图片描述
解释:
第一层(输入层):输入层单元个数由下一个flatten层指定。
第一层(flatten层):因为图片数据是28X28 的二维数据,不能直接进行Dense运算,Dense运算是一维张量映射运算,所以需要将每张图片展平。展平过后每张图片变成28X28=784 的一维向量。所以,flatten层单元个数为图片展平后的长度。该层只负责展平作用,无需参数。
第二层(隐藏层):单元个数为128(自定义),不能太多也不能太少,太多可能导致过拟合,太少可能导致会舍弃一些重要特征。上一层的输出为784,一共需要(784+1)X128 = 100480个参数。 用relu激活
第三层(输出层):单元个数为10(因为要输出10个服饰类别的概率),用softmax进行激活

  1. 编译、开始训练模型并绘制训练过程的loss、acc曲线
  • 编译、训练
# 为模型添加优化算法与损失函数
model.compile(
    optimizer="adam",
    loss="sparse_categorical_crossentropy",     #用数字编码时,损失函数用这个
    metrics=["acc"]  #记录并打印精确值
)
# his 记录模型训练信息
his = model.fit(x=train_image,y=train_label,
                epochs=10,batch_size=32,
                validation_data=(test_image,test_label)   #每次训练都用测试集数据评估
               )

自动打印:
在这里插入图片描述

解释:每次训练喂入32张图片(一次最多只能喂入32),一次训练对所有图片则需要1875次遍历

  • 绘制loss、acc曲线:
# 绘制loss曲线
plt.plot(his.epoch,his.history.get("loss"),label='train_loss')
plt.plot(his.epoch,his.history.get("val_loss"),label='test_loss')
plt.legend()

在这里插入图片描述
分析:当epoch=4时,test_loss达到最低,随着epoch的增加,test_loss增加,train_loss一直减少,可见出现了过拟合问题

# 绘制acc曲线
plt.plot(his.epoch,his.history.get("acc"),label='train_acc')
plt.plot(his.epoch,his.history.get("val_acc"),label='test_acc')
plt.legend()

在这里插入图片描述
分析:在训练数据上得分很高,在测试数据上得分相对较低,出现过拟合。可适当添加Dropout层

  1. 增加网络深度与Dropout层改善模型:
# 构建序列模型
model = tf.keras.Sequential()
# 添加各层
    #(展平层):将二维图片数据展平开,只需指定输入数据的维度,其单元个数会自动计算
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
    #(隐藏层):自定义128个单元个数,用relu函数激活
model.add(tf.keras.layers.Dense(128,activation="relu"))
    #(dropout层):以0.5的比率舍弃部分神经元
model.add(tf.keras.layers.Dropout(0.5))
    #(隐藏层):
model.add(tf.keras.layers.Dense(128,activation="relu"))
    #(dropout层)
model.add(tf.keras.layers.Dropout(0.5))
    #(隐藏层)
model.add(tf.keras.layers.Dense(128,activation="relu"))
    #(dropout层)
model.add(tf.keras.layers.Dropout(0.5))
    #(输出层):输出各个服饰类别,因为有10个类别所以单元个数为10,用softmax
model.add(tf.keras.layers.Dense(10,activation="softmax"))

新构建的模型训练完毕后绘制loss—acc曲线:
在这里插入图片描述
在这里插入图片描述
分析:test_loss比train_loss低,test_acc比train_acc高,模型在测试集上表现良好,过拟合问题得到解决

  1. 用测试数据集对模型经行评估和预测
  • 评估:
# 用测试数据对模型进行评估:
model.evaluate(x=test_image,y=test_label)

在这里插入图片描述
解释:1万张图片,每次喂入32张,大约需要313次遍历。loss: 0.3478 - acc: 0.8755

  • 预测:
import numpy as np 
# 用测试数据对模型进行预测测试
pre = model.predict(x=test_image)  #有1万张图片,对每张图片会输出10个服饰类别的概率值
# 取出第3张图片的预测结果
imag = pre[2]
# 取出图片最大概率的index
np.argmax(imag)

在这里插入图片描述
结果显示预测的label=1
查看实际正确的label:
在这里插入图片描述
一致,说明这张图片预测成功。

三、 独热编码

还是以Fashion MNIST 数据集为例,之前的数据标签label是数字,将之前的数字编码转变为独热编码

#数字编码转为独热编码
train_label_onhot = tf.keras.utils.to_categorical(train_label)
test_label_onhot = tf.keras.utils.to_categorical(test_label)

在这里插入图片描述
对于独热编码形式的数据集来说,训练所需的网络与上述构建的网络一致,仅在编译compile中的损失函数不同。

# 独热编码下所需的loss函数不同
model.compile(
    optimizer="adam",
    loss="categorical_crossentropy",     #用独热编码时,损失函数用这个
    metrics=["acc"]  #记录并打印精确值
)

后期的模型训练与评估与上述相同。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值