MNIST 数据集

  • MNIST 数据集介绍
  • LeNet 模型介绍
    • 卷积
    • 池化 (下采样)
    • 激活函数 (ReLU)
  • LeNet 逐层分析
    • 1. 第一个卷积层
    • 2. 第一个池化层
    • 3. 第二个卷积层
    • 4. 第二个池化层
    • 5. 全连接卷积层
    • 6. 全连接层
    • 7. 全连接层 (输出层)
  • 代码实现
    • 导包
    • 读取 & 查看数据
    • 数据预处理
    • 模型建立
    • 训练模型
    • 保存模型
  • 流程总结
  • 完整代码

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)),# relutf.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)),# relutf.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')

TensorFlow MNIST 数据集相关推荐

  1. Tensorflow mnist 数据集测试代码 + 自己下载数据

    https://blog.csdn.net/weixin_39673686/article/details/81068582 import tensorflow as tf from tensorfl ...

  2. Tensorflow— MNIST数据集分类简单版本

    代码: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data#载入数据集 #当前路径 m ...

  3. TensorFlow Mnist数据集下载问题

    安装好TensorFlow后,按教程输入如下命令时,会出现不能下载数据的问题. from tensorflow.examples.tutorials.mnist import input_data m ...

  4. MNIST数据集实现手写数字识别(基于tensorflow)

    ------------先看看别人的博客--------------------- Tensorflow 实现 MNIST 手写数字识别         用这个的代码跑通了 使用Tensorflow和 ...

  5. 深度学习4:使用MNIST数据集(tensorflow)

    本文将介绍MNIST数据集的数据格式和使用方法,使用到的是tensorflow中封装的类,包含代码. MNIST数据集来源于这里, 如果希望下载原始格式的数据集,可以从这里下载.而本文中讲解的是已经使 ...

  6. 深度学习之利用TensorFlow实现简单的卷积神经网络(MNIST数据集)

    卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习 ...

  7. 深度学习之利用TensorFlow实现简单的全连接层网络(MNIST数据集)

    Tensorflow是一个基于数据流编程(Dataflow Programming)的符号数学系统,被广泛应用于各类机器学习(Machine Learning)算法的编程实现,其前身是谷歌的神经网络算 ...

  8. 使用MNIST数据集,在TensorFlow上实现基础LSTM网络

    使用MNIST数据集,在TensorFlow上实现基础LSTM网络 By 路雪2017年9月29日 13:39 本文介绍了如何在 TensorFlow 上实现基础 LSTM 网络的详细过程.作者选用了 ...

  9. TensorFlow:实战Google深度学习框架(四)MNIST数据集识别问题

    第5章 MNIST数字识别问题 5.1 MNIST数据处理 5.2 神经网络的训练以及不同模型结果的对比 5.2.1 TensorFlow训练神经网络 5.2.2 使用验证数据集判断模型的效果 5.2 ...

  10. TensorFlow读取MNIST数据集错误的问题

    TensorFlow读取mnist数据集错误的问题 运行程序出现"URLError"错误的问题 可能是服务器或路径的原因,可以自行下载数据集后,将数据集放到代码所在的文件夹下,并将 ...

最新文章

  1. 败家玩意儿!Redis 竟然浪费了这么多内存!
  2. java回退一格_api短信接口
  3. Python基础入门:常用的os操作
  4. 计算机与采集卡无法通信,通信工程毕业设计(论文)-基于.NET平台的高速图像采集.doc...
  5. Flink 1.9 : Wordcount报错:ClassNotFoundException: yarn.exceptions.YarnException
  6. easyui的datagrid的使用方法
  7. Linux打开端口iptables
  8. lordPE转自http://blog.sina.com.cn/s/blog_6e8f83bc01014115.html
  9. EXCEL的各种“空”的区别:blank,““ , 0 ,以及 VBA里的各种空值:empty,null,nothing 等
  10. 一个失败的项目管理案例
  11. java实现屏幕亮度调节
  12. 【修真院java小课堂】Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
  13. 绑定挂载mount --bind介绍
  14. 如何选择合适的无线网桥
  15. 苹果手机越狱软件_刷上 Linux,安卓手机成功越狱解锁苹果 iPhone
  16. 斗地主自动出牌函数c语言,斗地主AI出牌(示例代码)
  17. HCNP-RS培训视频课程[简讲版]-马青-专题视频课程
  18. 什么是数据指标管理,如何建立指标管理体系
  19. Mozilla准备推付费版Firefox浏览器
  20. DEDECMS后台Link模板

热门文章

  1. Could not find artifact com.oracle:ojdbc7:pom:12.1.0.2 in central (https://r......的解决方案
  2. Intel Fortran编译器安装
  3. 详解2021华为笔试三道编程题
  4. 应急卫星通信系统项目建设要求
  5. CMOS工作原理和概念
  6. 暴汗~莫明其妙收到一张汇款单......
  7. STM32F407 + Codec AK4556 + NAND Flash MX30LF2G 录音机实现
  8. Appium+python自动化(二十六)- 烟花一瞬,昙花一现 -Toast提示(超详解)
  9. 五笔字根表识别码图_86版五笔字根表及口诀(最新图文版)
  10. 免费复制百度文库的方法