Tensorflow2.0学习(2):基于fashion_mnist数据集的分类基本步骤

2024-01-13 09:08

本文主要是介绍Tensorflow2.0学习(2):基于fashion_mnist数据集的分类基本步骤,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 导入包、打印包的信息

  其中 %matplotlib inline 是IPython中的魔法函数,作用是:在利用matplotlib.pyplot作图或创建画布时不需要plt.show(),即可实现图像的显示。

import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import sklearn
import pandas as pd
import os
import sys
import time
import tensorflow as tf
from tensorflow import keras
print(tf.__version__)
print(sys.version_info)
for module in mpl, np ,pd, sklearn, tf, keras:print(module.__name__, module.__version__)
2.1.0
sys.version_info(major=3, minor=7, micro=4, releaselevel='final', serial=0)
matplotlib 3.1.1
numpy 1.16.5
pandas 0.25.1
sklearn 0.21.3
tensorflow 2.1.0
tensorflow_core.python.keras.api._v2.keras 2.2.4-tf
  • 下载、读取、分割数据集
# 读取keras中的进阶版mnist数据集
fashion_mnist = keras.datasets.fashion_mnist
# 加载数据集,切分为训练集和测试集
(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()
# 从训练集中将后五千张作为验证集,前五千张作为训练集
# [:5000]默认从头开始,从头开始取5000个
# [5000:]从第5001开始,结束位置默认为最后
x_valid, x_train = x_train_all[:5000], x_train_all[5000:]
y_valid, y_train = y_train_all[:5000], y_train_all[5000:]
# 打印这些数据集的大小
print(x_valid.shape, y_valid.shape)
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 7s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 1s 0us/step
(5000, 28, 28) (5000,)
(55000, 28, 28) (55000,)
(10000, 28, 28) (10000,)

  可以得出,训练集有55000张图片,每张图片为28*28;验证集有5000张图片;测试集有1000张图片。

  • 显示图片
def show_single_image(img_arr):plt.imshow(img_arr, cmap="binary")plt.show()
# 显示训练集第一张图片    
show_single_image(x_train[0])

在这里插入图片描述

# 设置n_rows行与n_cols列用来显示图像,共显示x_data个图像
#(y_data是其标签,class_names是其真实的类名)
def show_imgs(n_rows, n_cols, x_data, y_data, class_names):# 断言:不满足条件触发异常assert len(x_data) == len(y_data)assert n_rows * n_cols <len(x_data)plt.figure(figsize=(n_cols * 1.4, n_rows * 1.6))for row in range(n_rows):for col in range(n_cols):index = n_cols * row + col# 总的图像为n_rows * n_cols,当前图像位置为index+1plt.subplot(n_rows, n_cols, index+1)plt.imshow(x_data[index], cmap="binary",interpolation = 'nearest')plt.axis('off')plt.title(class_names[y_data[index]])plt.show()
class_names = ['T-shirt','Trouser','Pullover','Dress','Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag','Ankle boot']
# 显示训练集的十五张图片              
show_imgs(3, 5, x_train, y_train, class_names)

在这里插入图片描述

  • 构建模型
# tf.keras.models.Sequential() 构建模型的容器# 创建一个Sequential的对象,顺序模型,多个网络层的线性堆叠
# 可使用add方法将各层添加到模块中
model = keras.models.Sequential()# 添加层次
# 输入层:Flatten将28*28的图像矩阵展平成为一个一维向量
model.add(keras.layers.Flatten(input_shape=[28,28]))# 全连接层(上层所有单元与下层所有单元都连接):
# 第一层300个单元,第二层100个单元,激活函数为 relu:
# relu: y = max(0, x)
model.add(keras.layers.Dense(300,activation="relu"))          
model.add(keras.layers.Dense(100,activation="relu"))# 输出为长度为10的向量,激活函数为 softmax:
# softmax: 将向量变成概率分布,x = [x1, x2, x3],
# 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"))# 目标函数的构建与求解方法
# 为什么使用sparse? : 
# y->是一个数,要用sparse_categorical_crossentropy
# y->是一个向量,直接用categorical_crossentropy
model.compile(loss="sparse_categorical_crossentropy",optimizer="adam",metrics = ["accuracy"])
"""
构建模型也可以这样:
model = keras.models.Sequential([keras.layers.Flatten(input_shape=[28,28]),keras.layers.Dense(300,activation="relu"),keras.layers.Dense(300,activation="relu"),keras.layers.Dense(10,activation="softmax")
])"""
  • 查看模型
# 看模型的层情况
model.layers
[<tensorflow.python.keras.layers.core.Flatten at 0x28a9c583088>,<tensorflow.python.keras.layers.core.Dense at 0x28a9c583108>,<tensorflow.python.keras.layers.core.Dense at 0x28a9c5cbec8>,<tensorflow.python.keras.layers.core.Dense at 0x28a9c925f88>]
# 看模型的概况
model.summary()# 参数量:[None,784] * w + b -> [None, 300]:w.shape=[784, 300],b = 300
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
_________________________________________________________________
  • 训练
# 开启训练
# epochs:训练集遍历10次
# validation_data:每个epoch就会用验证集验证
# 会发现loss和accuracy到后面一直不变,因为用sgd梯度下降法会导致陷入局部最小值点
# 因此将loss函数的下降方法改为 adam
history = model.fit(x_train, y_train, epochs=10,validation_data=(x_valid, y_valid))
Train on 55000 samples, validate on 5000 samples
Epoch 1/10
55000/55000 [==============================] - 4s 69us/sample - loss: 2.5882 - accuracy: 0.7635 - val_loss: 0.6161 - val_accuracy: 0.8122
Epoch 2/10
55000/55000 [==============================] - 3s 62us/sample - loss: 0.5384 - accuracy: 0.8169 - val_loss: 0.5430 - val_accuracy: 0.8268
Epoch 3/10
55000/55000 [==============================] - 3s 62us/sample - loss: 0.4813 - accuracy: 0.8317 - val_loss: 0.5800 - val_accuracy: 0.8166
Epoch 4/10
55000/55000 [==============================] - 3s 63us/sample - loss: 0.4575 - accuracy: 0.8381 - val_loss: 0.5061 - val_accuracy: 0.8276
Epoch 5/10
55000/55000 [==============================] - 3s 62us/sample - loss: 0.4363 - accuracy: 0.8447 - val_loss: 0.4295 - val_accuracy: 0.8612
Epoch 6/10
55000/55000 [==============================] - 3s 62us/sample - loss: 0.4133 - accuracy: 0.8530 - val_loss: 0.4093 - val_accuracy: 0.8602
Epoch 7/10
55000/55000 [==============================] - 3s 63us/sample - loss: 0.3913 - accuracy: 0.8603 - val_loss: 0.4328 - val_accuracy: 0.8506
Epoch 8/10
55000/55000 [==============================] - 3s 63us/sample - loss: 0.3798 - accuracy: 0.8635 - val_loss: 0.3907 - val_accuracy: 0.8564
Epoch 9/10
55000/55000 [==============================] - 4s 64us/sample - loss: 0.3694 - accuracy: 0.8681 - val_loss: 0.4227 - val_accuracy: 0.8564
Epoch 10/10
55000/55000 [==============================] - 4s 64us/sample - loss: 0.3625 - accuracy: 0.8696 - val_loss: 0.4136 - val_accuracy: 0.8630
  • 查看训练后的结果
type(history)
tensorflow.python.keras.callbacks.History
history.history
# loss是训练集的损失值,val_loss是测试集的损失值
{'loss': [2.5882461955070495,0.5384013248010115,0.48129710446704516,0.45748968857851896,0.43628633408329703,0.41328840144330803,0.3912581247546456,0.37976206094351683,0.3693601242488081,0.3625139371091669],'accuracy': [0.7634909,0.81685454,0.8316727,0.83805454,0.84467274,0.8529818,0.8602909,0.8634727,0.86814547,0.8695818],'val_loss': [0.6161495039701462,0.542988519859314,0.5799951359272003,0.506083318400383,0.4295428094863892,0.40931380726099015,0.4327934848666191,0.39065408419966696,0.42266337755918504,0.41358628759980204],'val_accuracy': [0.8122,0.8268,0.8166,0.8276,0.8612,0.8602,0.8506,0.8564,0.8564,0.863]}
def plot_learning_curves(history):# 将history.history转换为dataframe格式pd.DataFrame(history.history).plot(figsize=(8, 5 ))plt.grid(True)# gca:get current axes,gcf: get current figureplt.gca().set_ylim(0, 1)plt.show()
plot_learning_curves(history)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PzEQNq8y-1582528839439)(output_10_0.png)]

# 转换为dataframe格式进行查看
pd.DataFrame(history.history)
lossaccuracyval_lossval_accuracy
02.5882460.7634910.6161500.8122
10.5384010.8168550.5429890.8268
20.4812970.8316730.5799950.8166
30.4574900.8380550.5060830.8276
40.4362860.8446730.4295430.8612
50.4132880.8529820.4093140.8602
60.3912580.8602910.4327930.8506
70.3797620.8634730.3906540.8564
80.3693600.8681450.4226630.8564
90.3625140.8695820.4135860.8630

这篇关于Tensorflow2.0学习(2):基于fashion_mnist数据集的分类基本步骤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600942

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

Spring Boot 中整合 MyBatis-Plus详细步骤(最新推荐)

《SpringBoot中整合MyBatis-Plus详细步骤(最新推荐)》本文详细介绍了如何在SpringBoot项目中整合MyBatis-Plus,包括整合步骤、基本CRUD操作、分页查询、批... 目录一、整合步骤1. 创建 Spring Boot 项目2. 配置项目依赖3. 配置数据源4. 创建实体类