【深度学习01】Fashion MNIST数据集分类模型笔记

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
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值