【tensorflow2.0】softmax多分类代码实现

fashion mnist数据集是成为经典mnist数据集的简易替换。mnist数据集包含手写数字(0,1,2等)的图像,这些图像的格式与fashion mnist数据集中使用的服饰图像的格式相同。相对而言,这两个数据集比较简单,适合初学者。

Fashion MNIST数据集包含70000张灰度图像,涵盖裙子、衬衫、裤子、鞋、包等10个类别。
本示例将使用60000张图像训练网络,并使用10000张图像测试学习的网络分类图像的准确率。可以从tensorflow直接访问该数据集,只需要导入和加载数据即可。

(1)
加载数据

import tensorflow as tf
print('Tensorflow Version: {}'.format(tf.__version__))
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
(train_image, train_lable), (test_image, test_label) = tf.keras.datasets.fashion_mnist.load_data()

若第一次使用此数据集,要从国外网站下载,会很慢;也可以直接下载数据集放到c盘的用户-86188-.keras-datasets文件夹中。

train_image.shape

看train_image的形状,输出结果为(60000, 28, 28),即60000张28×28的图片。

看一下train_image的第一张图片:

plt.imshow(train_image[0])

是一张鞋子,train_image内各个点的取值范围均为0-255。
看一下这些点里面的最大值:

np.max(train_image)

本示例输出结果为255.
train_lable代表种类,从0-9有十种分类。

(2)
数据处理:
神经网络比较喜欢固定的输入值,比如在输入前,将数据归一化为0到1之间的数。
对于图像数据而言,归一化的方法就是将此数据除以255:

train_image = train_image / 255
test_image = test_image / 255

这样,train_image 和test_image的取值范围都变成了[0,1]。
再看一看train_image 的形状,因为下面会用到:

train_image.shape

输出结果为(60000, 28, 28)

(3)
建立模型,进行分类:

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'))#输出10个概率

Dense是把一个一维(张量为1)的数据映射到另一个一维的数据上。
对于二维的数据,需要进行Flatten,将其扁平为一维的。

(4)
编译模型:

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy'
              metrics=['acc']
)

(5)
训练模型:

model.fit(train_image, train_lable, epochs=5)

(6)
评价模型:

model.evaluate(test_image, test_lable)

(7)
转换为独热编码onehot:
仍采用之前的数据集

train_lable_onehot = tf.keras.utils.to_categorical(train_lable)

(8)
预测:

predict = model.predict(test_image)
predict.shape

会输出(10000,10),即10000个长度为10的数据。因为test_image的形状是(10000,28,28),对这10000个图像,每个图像都给出长度为10的向量,代表其分类结果。

predict[0]

会输出一个10维向量。

np.argmax(predict[0])

取出其中的最大的值所在的索引,本案例结果为9.

(9)dropout:

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.Dropout(0.5))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(10, activation='softmax'))

Drpout()有一个参数rate,应是0到1之间的值,代表需要丢弃掉多少数值。Dropout(0.5)代表激活50%,丢弃50%的数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值