0 前置
We start by building a simple image classifier using MLPs.
如果之前Anaconda没有安装过tensorflow模块,就会报错:
No module named ‘tensorflow’
原因:未安装相应的包
解决方式:输入以下代码安装即可,过程可能会花几分钟
pip install tensorflow
调用常用的module
# import Keras & Tensorflow
import tensorflow as tf
import matplotlib.pyplot as plt
import pandas as pd
from tensorflow import keras
# 查看相应的版本
print(tf.__version__)
print(keras.__version__)
2.4.1
2.4.0
1 载入数据集
我们使用的是Keras提供的Fashion MNIST数据集。
首先介绍一下Fashion MNIST数据集,它由7万张灰度图像组成,可以分成10个类别.每个灰度图像都是28*28像素的图像.我们将使用其中的6万张进行training,另外的1万张来test.
每个图像都可以理解为一个28×28的numpy数组,每个像素值在0到255之间.标签取值在0-9之间,代表着衣服的类型,如下表所示。
标签取值 | 衣服类型 |
---|---|
0 | T-shirt/top |
1 | Trouser |
2 | Pullover |
3 | Dress |
4 | Coat |
5 | Sandal |
6 | Skirt |
7 | Sneaker |
8 | Bag |
9 | Ankle boot |
载入数据集,载入训练集和测试集
# Load image data 下载数据集
fashion_mnist = keras.datasets.fashion_mnist
# 载入训练集和测试集(默认顺序)
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
# 定义名称list(方便label转名称)
# 即:在代码上补充一下每个类别的名称,组成一个list,代码如下:
class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat", "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]
2 数据预处理
探索数据
数据集维度
之前说过,我们的训练集由6万张2828像素的图像组成,所以可以得到训练集的特征的大小是(60000,28,28),同样测试集是由1万张2828像素的图像组成的,所以它的大小是(10000,28,28)
# Show information: traing/test size
# 打印数据集维度
print('Training data size: ', x_train.shape)
print('Test data size: ', x_test.shape)
Training data size: (60000, 28, 28)
Test data size: (10000, 28, 28)
寻找训练/测试集的图像标签
# 寻找训练/测试集的图像标签
print(class_names[y_train[0]])
print(class_names[y_test[0]])
Ankle boot
Ankle boot
打印归一化之前训练集的最大值和最小值
print(np.max(x_train),np.min(x_train))#打印归一化之前训练集的最大值和最小值
255 0
展示一张图片
# show an image
import numpy as np
import matplotlib.pyplot as plt
plt.imshow(x_train[0, ], cmap = 'gray')
plt.show()
展示一张图片
plt.figure()
plt.imshow(x_train[0])
plt.colorbar()
plt.grid(False)
#显示多张照片
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(x_train[i], cmap=plt.cm.binary)
plt.xlabel(class_names[y_train[i]])
归一化
# Data preparation:
# Map intensities from [0--255] to 0.0--1.0
# 数据归一化(由0:255 -> 0:1,数据量压缩,不易产生溢出,易于训练)
x_train = x_train / 255.0
x_test = x_test / 255.0
3 开始训练
#构建MLP分类器,使用来自Keras的Sequential模型
#第一步,创建Sequnetial对象
model = keras.models.Sequential()
#第二步,在对象中创建层次(全连接)
#将图片展开,将28*28的矩阵展平为28*28的一维向量
model.add(keras.layers.Flatten(input_shape=[28, 28]))
#全链接层,神经网络的一种,以层次来发掘神经网络,下层单元与上层单元一一链接
#300代表神经元个数,activation是激活函数
model.add(keras.layers.Dense(300, activation="relu"))
#添加两个,relu:y=max(0,x)
model.add(keras.layers.Dense(100, activation="relu"))
#因为我们应该得到长度为10的概率分布,所以最后一层输出层神经元个数为10
#一般最后多元分类输出层激活函数为softmax
#控制输出,长度为10的向量。
#softmax将向量变成概率分布,x=[x1,x2,x3]
#softmax运算:y=[e^x1/sum,e^x2/sum,e^x3/sum],(sum=e^x1+e^x2+e^x3)
model.add(keras.layers.Dense(10, activation="softmax"))
#在这里构建了四层的神经网络,使用了sgd方法。
#接着让我们看一下模型参数,利用model.summary()函数。
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 784) 0
_________________________________________________________________
dense (Dense) (None, 300) 235500
_________________________________________________________________
dense_1 (Dense) (None, 100) 30100
_________________________________________________________________
dense_2 (Dense) (None, 10) 1010
=================================================================
Total params: 266,610
Trainable params: 266,610
Non-trainable params: 0
_________________________________________________________________
激活函数get
计算目标函数
调用compile函数
- crossentropy为交叉熵损失函数
- 使用sparse原因:y是跟x长度一致的向量,是一个Index值,我们需要把它变成一个one_hot值,即:
y是向量,loss = categorical_crossentropy,
y是数,loss=“sparse_categorical_crossentropy”
optimizer:模型求解调整方法
metrics:除了关心目标函数以外,还要考虑到其他方面,accuracy
# Compile the model
#将损失函数和优化方法加到图中去。
#y为长度等于样本数量的向量,故y为一个值,所以用sparse_categorical_crossentropy
model.compile(loss = "sparse_categorical_crossentropy", optimizer="sgd", metrics = ["accuracy"])
#参数(损失函数,调整方法,其他所关心指标)
优化器是AdamOptimizer(表示采用何种方式寻找最佳答案,有什么梯度下降啊等等),
损失函数是sparse_categorical_crossentropy(就是损失函数怎么定义的,最佳值就是使得损失函数最小).
计量标准是准确率,也就是正确归类的图像的概率.
进行训练:
# Model training
# epoch:遍历训练集次数
# 开始训练,调用model.fit函数,进行30次训练:
history = model