由浅入深学习TensorFlow MNIST 数据集
作者:我是小白呀 发布时间:2021-06-04 23:57:52
MNIST 数据集介绍
MNIST 包含 0~9 的手写数字, 共有 60000 个训练集和 10000 个测试集. 数据的格式为单通道 28*28 的灰度图.
LeNet 模型介绍
LeNet 网络最早由纽约大学的 Yann LeCun 等人于 1998 年提出, 也称 LeNet5. LeNet 是神经网络的鼻祖, 被誉为卷积神经网络的 “Hello World”.
卷积
池化 (下采样)
激活函数 (ReLU)
LeNet 逐层分析
1. 第一个卷积层
2. 第一个池化层
3. 第二个卷积层
4. 第二个池化层
5. 全连接卷积层
6. 全连接层
7. 全连接层 (输出层)
代码实现
导包
from tensorflow.keras.datasets import mnist
from matplotlib import pyplot as plt
import numpy as np
import tensorflow as tf
读取 & 查看数据
# ------------------1. 读取 & 查看数据------------------
# 读取数据
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 数据集查看
print(X_train.shape) # (60000, 28, 28)
print(y_train.shape) # (60000,)
print(X_test.shape) # (10000, 28, 28)
print(y_test.shape) # (10000,)
print(type(X_train)) # <class 'numpy.ndarray'>
# 图片显示
plt.imshow(X_train[0], cmap="Greys") # 查看第一张图片
plt.show()
数据预处理
# ------------------2. 数据预处理------------------
# 格式转换 (将图片从28*28扩充为32*32)
X_train = np.pad(X_train, ((0, 0), (2, 2), (2, 2)), "constant", constant_values=0)
X_test = np.pad(X_test, ((0, 0), (2, 2), (2, 2)), "constant", constant_values=0)
print(X_train.shape) # (60000, 32, 32)
print(X_test.shape) # (10000, 32, 32)
# 数据集格式变换
X_train = X_train.astype(np.float32)
X_test = X_test.astype(np.float32)
# 数据正则化
X_train /= 255
X_test /= 255
# 数据维度转换
X_train = np.expand_dims(X_train, axis=-1)
X_test = np.expand_dims(X_test, axis=-1)
print(X_train.shape) # (60000, 32, 32, 1)
print(X_test.shape) # (10000, 32, 32, 1)
模型建立
# 第一个卷积层
conv_layer_1 = tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding="valid", activation=tf.nn.relu)
# 第一个池化层
pool_layer_1 = tf.keras.layers.MaxPool2D(pool_size=(2, 2), padding="same")
# 第二个卷积层
conv_layer_2 = tf.keras.layers.Conv2D(filters=16, kernel_size=(5, 5), padding="valid", activation=tf.nn.relu)
# 第二个池化层
pool_layer_2 = tf.keras.layers.MaxPool2D(padding="same")
# 扁平化
flatten = tf.keras.layers.Flatten()
# 第一个全连接层
fc_layer_1 = tf.keras.layers.Dense(units=120, activation=tf.nn.relu)
# 第二个全连接层
fc_layer_2 = tf.keras.layers.Dense(units=84, activation=tf.nn.softmax)
# 输出层
output_layer = tf.keras.layers.Dense(units=10, activation=tf.nn.softmax)
卷积 Conv2D 的用法:
filters: 卷积核个数
kernel_size: 卷积核大小
strides = (1, 1): 步长
padding = “vaild”: valid 为舍弃, same 为补齐
activation = tf.nn.relu: 激活函数
data_format = None: 默认 channels_last
池化 AveragePooling2D 的用法:
pool_size: 池的大小
strides = (1, 1): 步长
padding = “vaild”: valid 为舍弃, same 为补齐
activation = tf.nn.relu: 激活函数
data_format = None: 默认 channels_last
全连接 Dense 的用法:
units: 输出的维度
activation: 激活函数
strides = (1, 1): 步长
padding = “vaild”: valid 为舍弃, same 为补齐
activation = tf.nn.relu: 激活函数
data_format = None: 默认 channels_last
# 模型实例化
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding='valid', activation=tf.nn.relu,
input_shape=(32, 32, 1)),
# relu
tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
tf.keras.layers.Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation=tf.nn.relu),
tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(units=120, activation=tf.nn.relu),
tf.keras.layers.Dense(units=84, activation=tf.nn.relu),
tf.keras.layers.Dense(units=10, activation=tf.nn.softmax)
])
# 模型展示
model.summary()
输出结果:
训练模型
# ------------------4. 训练模型------------------
# 设置超参数
num_epochs = 10 # 训练轮数
batch_size = 1000 # 批次大小
learning_rate = 0.001 # 学习率
# 定义优化器
adam_optimizer = tf.keras.optimizers.Adam(learning_rate)
model.compile(optimizer=adam_optimizer,loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
complie 的用法:
optimizer: 优化器
loss: 损失函数
metrics: 评价
with tf.Session() as sess:
# 初始化所有变量
init = tf.global_variables_initializer()
sess.run(init)
model.fit(x=X_train,y=y_train,batch_size=batch_size,epochs=num_epochs)
# 评估指标
print(model.evaluate(X_test, y_test)) # loss value & metrics values
输出结果:
fit 的用法:
x: 训练集
y: 测试集
batch_size: 批次大小
enpochs: 训练遍数
保存模型
# ------------------5. 保存模型------------------
model.save('lenet_model.h5')
流程总结
完整代码
from tensorflow.keras.datasets import mnist
from matplotlib import pyplot as plt
import numpy as np
import tensorflow as tf
# ------------------1. 读取 & 查看数据------------------
# 读取数据
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 数据集查看
print(X_train.shape) # (60000, 28, 28)
print(y_train.shape) # (60000,)
print(X_test.shape) # (10000, 28, 28)
print(y_test.shape) # (10000,)
print(type(X_train)) # <class 'numpy.ndarray'>
# 图片显示
plt.imshow(X_train[0], cmap="Greys") # 查看第一张图片
plt.show()
# ------------------2. 数据预处理------------------
# 格式转换 (将图片从28*28扩充为32*32)
X_train = np.pad(X_train, ((0, 0), (2, 2), (2, 2)), "constant", constant_values=0)
X_test = np.pad(X_test, ((0, 0), (2, 2), (2, 2)), "constant", constant_values=0)
print(X_train.shape) # (60000, 32, 32)
print(X_test.shape) # (10000, 32, 32)
# 数据集格式变换
X_train = X_train.astype(np.float32)
X_test = X_test.astype(np.float32)
# 数据正则化
X_train /= 255
X_test /= 255
# 数据维度转换
X_train = np.expand_dims(X_train, axis=-1)
X_test = np.expand_dims(X_test, axis=-1)
print(X_train.shape) # (60000, 32, 32, 1)
print(X_test.shape) # (10000, 32, 32, 1)
# ------------------3. 模型建立------------------
# 第一个卷积层
conv_layer_1 = tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding="valid", activation=tf.nn.relu)
# 第一个池化层
pool_layer_1 = tf.keras.layers.MaxPool2D(pool_size=(2, 2), padding="same")
# 第二个卷积层
conv_layer_2 = tf.keras.layers.Conv2D(filters=16, kernel_size=(5, 5), padding="valid", activation=tf.nn.relu)
# 第二个池化层
pool_layer_2 = tf.keras.layers.MaxPool2D(padding="same")
# 扁平化
flatten = tf.keras.layers.Flatten()
# 第一个全连接层
fc_layer_1 = tf.keras.layers.Dense(units=120, activation=tf.nn.relu)
# 第二个全连接层
fc_layer_2 = tf.keras.layers.Dense(units=84, activation=tf.nn.softmax)
# 输出层
output_layer = tf.keras.layers.Dense(units=10, activation=tf.nn.softmax)
# 模型实例化
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding='valid', activation=tf.nn.relu,
input_shape=(32, 32, 1)),
# relu
tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
tf.keras.layers.Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation=tf.nn.relu),
tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(units=120, activation=tf.nn.relu),
tf.keras.layers.Dense(units=84, activation=tf.nn.relu),
tf.keras.layers.Dense(units=10, activation=tf.nn.softmax)
])
# 模型展示
model.summary()
# ------------------4. 训练模型------------------
# 设置超参数
num_epochs = 10 # 训练轮数
batch_size = 1000 # 批次大小
learning_rate = 0.001 # 学习率
# 定义优化器
adam_optimizer = tf.keras.optimizers.Adam(learning_rate)
model.compile(optimizer=adam_optimizer,loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
with tf.Session() as sess:
# 初始化所有变量
init = tf.global_variables_initializer()
sess.run(init)
model.fit(x=X_train,y=y_train,batch_size=batch_size,epochs=num_epochs)
# 评估指标
print(model.evaluate(X_test, y_test)) # loss value & metrics values
# ------------------5. 保存模型------------------
model.save('lenet_model.h5')
来源:https://blog.csdn.net/weixin_46274168/article/details/114109017


猜你喜欢
- 1.0 创建存储过程和函数创建存储过程和函数就是将经常使用的一组 SQL 语句组合在一起,并将这些 SQL 语句当作一个整体存储
- jqGrid是一个优秀的基于jQuery的DataGrid框架,想必大伙儿也不陌生,网上基于ASP的资料很少,我提供一个,数据格式是json
- 本文实例为大家分享了Python每天迁移MySQL历史数据到历史库的具体代码,供大家参考,具体内容如下#!/usr/bin/env pyth
- 维护脚本一例,写得有点乱,只是作为一个实例,演示如何快速利用工具快速达到目的:应用到:shell与python数据交互、数据抓取,编码转换#
- 当使用MySQL做站点的时候,肯定会有不知道的错误发生,怎么记录呢?以下是具体解决方法:class.method &n
- 本文实例讲述了Python3实现取图片 * 定的像素替换指定的颜色。分享给大家供大家参考,具体如下:1、原始图片2、修改脚本:# -*- co
- 一、查看存储过程存储过程创建以后,用户可以通过SHOW STATUS语句来查看存储过程的状态,也可以通过SHOW CREATE语句来查看存储
- 本文实例讲述了Python将阿拉伯数字转换为罗马数字的方法。分享给大家供大家参考。具体实现方法如下:def numToRomanNum(Nu
- 熟悉 C 语言的小伙伴一定对 goto 语句不陌生,它可以在代码之间随意的跳来跳去,但是好多老鸟都告诫大家,不要使用 goto,因为 got
- 利用字典dict来完成统计举例:a = [1, 2, 3, 1, 1, 2]dict = {}for key in a: dic
- 原本运行正常的ASP页面,今天突然提示: 代码如下: Microsoft VBScript 运行时错误 错误 '800a01a8&
- 1) 创建配置文件和帐户 (创建一个配置文件和配置数据库邮件向导,用以访问配置数据库邮件管理节点中的数据库邮件节点及其上下文菜单中使用的帐户
- 代码如下:Function htmll(mulu,htmlmulu,FileName,filefrom,htmla,htmlb,h
- 本文介绍了python画图时设置分辨率和画布大小的实现,主要使用plt.figure(),下面就一起来了解一下plt.figure()示例:
- 1.官网下载:https://dev.mysql.com/downloads/找到Mysql Community Server 点击点击do
- 我们在做自动化运维的时候,经常需要调用api中的接口,不过很多人不知道具体的调用方法,在学习python中的requests库后,我们就可以
- 前言版本:windows 10.0python 3.8多重继承在Python数字比较与类结构中有简略提到类,且在Python中类的mro与继
- 本文实例讲述了PHP获取客户端及服务器端IP的封装类。分享给大家供大家参考,具体如下:客户端IP相关的变量:1. $_SERVER['
- 阿里云提供了基于命名空间的 V2 版 SDK,但是文档不是很完整,使用门槛比较高,于是我封装了一个 Composer 包:https://g
- 1.前序当下载突然断开后,断点续传就需要了,继续前面下载的内容下载。解决了不需要重复下载2.技术原理HTTP/1.1 开始支持断点续传,一般