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万张测试数据。
2. ⽤plt显⽰图⽚
import matplotlib.pyplot as plt
# 显⽰⼀下第⼀张图⽚和对应的标签
plt.imshow(train_image[0])
train_label[0]
3. 数据的归⼀化处理:
对神经⽹络来说⽐较擅长处理⼩范围的数据,所以将图⽚中 0~255 的数据归⼀化为0~1之间。对图⽚来说⽐较好处理,只需除255即可
# 图⽚数据作归⼀化处理
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)))
#第三层(隐藏层):⾃定义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进⾏激活
5. 编译、开始训练模型并绘制训练过程的loss、acc曲线
编译、训练
# 为模型添加优化算法与损失函数
modelpile(
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,("loss"),label='train_loss')
plt.plot(his.epoch,("val_loss"),label='test_loss')
plt.legend()
分析:当epoch=4时,test_loss达到最低,随着epoch的增加,test_loss增加,train_loss⼀直减少,可见出现了过拟合问题# 绘制acc曲线
plt.plot(his.epoch,("acc"),label='train_acc')
plt.plot(his.epoch,("val_acc"),label='test_acc')
plt.legend()
分析:在训练数据上得分很⾼,在测试数据上得分相对较低,出现过拟合。可适当添加Dropout层
6. 增加⽹络深度与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⾼,模型在测试集上表现良好,过拟合问题得到解决7. ⽤测试数据集对模型经⾏评估和预测
评估:
# ⽤测试数据对模型进⾏评估:
model.evaluate(x=test_image,y=test_label)
解释:1万张图⽚,每次喂⼊32张,⼤约需要313次遍历。loss: 0.3478 - acc: 0.8755预测:
import numpy as np
# ⽤测试数据对模型进⾏预测测试
tensorflow入门教程pre = model.predict(x=test_image)#有1万张图⽚,对每张图⽚会输出10个服饰类别的概率值
# 取出第3张图⽚的预测结果
imag = pre[2]
# 取出图⽚最⼤概率的index
np.argmax(imag)
结果显⽰预测的label=1
查看实际正确的label:
⼀致,说明这张图⽚预测成功。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。