机器学习第一周:用卷积神经网络实现Mnist手写数字识别(付基础知识解释)

这篇具有很好参考价值的文章主要介绍了机器学习第一周:用卷积神经网络实现Mnist手写数字识别(付基础知识解释)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Mnist手写数字数据集介绍

MNIST 数据集是一个手写数字识别数据集,包含了 60000 张训练图像和 10000 张测试图像,每张图像都是 28x28 像素的灰度图像。

代码整体结构

  1. 在这个代码中,我们首先使用了 numpy 库中的 np.random.seed() 方法来设置随机种子,以确保结果可重复。

  1. 然后,我们使用了 Keras 中的 mnist.load_data() 方法来加载 MNIST 数据集。

  1. 接着,我们将数据转换为 float 类型并归一化,将标签转换为 one-hot 编码。

  1. 最后,我们定义了一个卷积神经网络模型,并使用 model.compile() 方法来编译模型,使用 model.fit() 方法来训练模型,使用 model.evaluate() 方法来评估模型。

其中,模型的损失函数为 categorical_crossentropy,优化器为 adam,评估指标为 accuracy。

构建网络的思路

这个例子中,我们使用了 Keras 框架来构建模型,使用了 Sequential 类来定义模型,并通过 model.add() 方法向其中添加各种层。

Sequential 类是 Keras 中的一种模型类型,可以用来构建序列模型。

序列模型是一个线性的层次结构,可以通过将神经网络层按顺序堆叠来构建。

在这个代码中,我们

  1. 首先添加了一个卷积层,

  1. 然后是一个最大池化层,

  1. 接着是一个 Dropout 层,

  1. 然后是一个 Flatten 层,

  1. 最后是两个全连接层。

其中,卷积层和最大池化层用于提取图像特征,

Dropout 层用于防止过拟合,

Flatten 层用于将多维输入展平为一维,

全连接层用于分类。

代码解析

#  -*- coding: utf-8 -*-

# 导入所需的库
import numpy as np
from keras.datasets import mnist 
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.utils import np_utils

导入所需模块

from keras.models import Sequential

keras.models 这个模块中包含了 Sequential 这个类,它是 Keras 中的一种模型类型,可以用来构建序列模型。序列模型是一个线性的层次结构,可以通过将神经网络层按顺序堆叠来构建。在这个代码中,我们使用 Sequential 类来定义模型,并通过 model.add() 方法向其中添加各种层。

from keras.layers import Dense, Dropout, Flatten

这句代码是导入了 Keras 中的 Dense、Dropout 和 Flatten 三个类。

其中,

  • Dense 类是 Keras 中的一种全连接层,

  • Dropout 类是 Keras 中的一种正则化层,

  • Flatten 类是 Keras 中的一种展平层。

在这个代码中,我们将这三个类导入到了当前的命名空间中,以便在后续的代码中使用。

具体来说,

Dense 类用于定义全连接层,它的作用是将输入和权重矩阵相乘,并加上偏置向量,然后将结果传递给激活函数。

Dropout 类用于定义正则化层,它的作用是在训练过程中随机地将一些神经元的输出设置为0,以防止过拟合。

Flatten 类用于定义展平层,它的作用是将多维输入展平为一维,以便于后续的全连接层进行处理。

因此,这三个类在卷积神经网络中都扮演着非常重要的角色。

from keras.layers.convolutional import Conv2D, MaxPooling2D

其中,

  • Conv2D 类是 Keras 中的一种卷积层,

  • MaxPooling2D 类是 Keras 中的一种最大池化层。

在这个代码中,我们将这两个类导入到了当前的命名空间中,以便在后续的代码中使用。

卷积层和最大池化层是卷积神经网络中最为基础的两种层,它们可以用于提取图像特征。

  • 卷积层通过对输入图像进行卷积操作,提取出其中的特征,

  • 而最大池化层则通过对输入图像进行最大池化操作,进一步提取出其中的主要特征。

这两种层的结合可以有效地提高卷积神经网络的性能。

keras.layers模块中还有一个Convolutional层,它是Conv2D的别名,用于处理图像数据的二维卷积层。

from keras.utils import np_utils

这句代码是导入了 Keras 中的 np_utils 模块,它包含了 to_categorical() 方法,可以将标签转换为 one-hot 编码。

在这个代码中,我们使用了 to_categorical() 方法将训练集和测试集的标签都转换为了 one-hot 编码,以便于后续的模型训练和评估。

在机器学习中,我们通常需要将分类变量转换为数值变量,以便于计算机进行处理。

而 one-hot 编码就是一种常用的分类变量转换方式。它将每个分类变量转换为一个二进制向量,向量的长度等于分类变量的取值个数,向量中只有一个元素为 1,其余元素都为 0。

例如,

对于一个有三个分类变量的数据集,

其中

  • 分类变量 A 有两个取值,

  • 分类变量 B 有三个取值,

  • 分类变量 C 有四个取值,

那么对于每个样本,我们可以

  • 将分类变量 A 转换为一个长度为 2 的二进制向量,

  • 分类变量 B 转换为一个长度为 3 的二进制向量,

  • 分类变量 C 转换为一个长度为 4 的二进制向量,

然后将这三个向量拼接起来,得到一个长度为 9 的向量,

这个向量就是该样本的 one-hot 编码。

这种编码方式可以保留分类变量之间的关系,同时也便于计算机进行处理。

设置随机种子,确保结果可重复

# 设置随机种子,确保结果可重复
seed = 7
np.random.seed(seed)

在机器学习中,我们通常需要使用随机数来初始化模型参数、划分数据集、打乱数据集等。

然而,由于计算机生成的随机数是伪随机数,其生成过程是基于一个初始种子的,因此如果我们不设置随机种子,那么每次运行程序时生成的随机数序列都是不同的,这会导致模型的训练结果不可重复。

为了确保结果的可重复性,我们可以在程序中设置随机种子,这样每次运行程序时生成的随机数序列都是相同的,从而保证了模型的训练结果是可重复的。

在这个代码中,我们使用了 numpy 库中的 np.random.seed() 方法来设置随机种子,以确保结果可重复。

在机器学习中,我们通常需要对模型进行调参、比较不同算法的性能等。

如果每次运行程序时得到的结果都是不同的,那么我们就无法进行有意义的比较和分析。

因此,为了确保实验结果的可重复性,我们需要保证每次运行程序时得到的结果都是相同的。

这就是为什么要保证结果的可重复性的原因。

加载数据

(X_train, y_train), (X_test, y_test) = mnist.load_data()

这句代码的作用是使用 Keras 中的 mnist.load_data() 方法来加载 MNIST 数据集,并将训练集和测试集分别赋值给 X_train、y_train 和 X_test、y_test 四个变量。

其中,X_train 和 X_test 分别是训练集和测试集的图像数据,y_train 和 y_test 分别是训练集和测试集的标签数据。

这个方法会返回两个元组,第一个元组包含了训练集的图像数据和标签数据,第二个元组包含了测试集的图像数据和标签数据。

因此,这句代码的作用就是将 MNIST 数据集加载到内存中,以便后续的模型训练和评估。

这种赋值方法叫做元组解包(Tuple Unpacking),可以将一个元组中的多个元素分别赋值给多个变量。

在这个例子中,mnist.load_data() 方法返回了两个元组,第一个元组包含了训练集的图像数据和标签数据,第二个元组包含了测试集的图像数据和标签数据。

通过元组解包的方式,我们可以将这两个元组中的四个数组分别赋值给 X_train、y_train、X_test 和 y_test 四个变量。

这样做的好处是可以简化代码,使代码更加清晰易懂。

使用元组解包的方式需要提前知道数据集的结构,即数据集返回的是一个包含多个元素的元组,每个元素分别代表了数据集中的一个部分。

在这个例子中,mnist.load_data() 方法返回的是一个包含两个元素的元组,第一个元素是一个包含了训练集图像数据和标签数据的元组,第二个元素是一个包含了测试集图像数据和标签数据的元组。

因此,我们可以使用元组解包的方式将这两个元组中的四个数组分别赋值给 X_train、y_train、X_test 和 y_test 四个变量。

如果不知道数据集的结构,就无法使用元组解包的方式来赋值。

MNIST 数据集的结构可以通过查看 Keras 或 TensorFlow 的文档来了解。

以 Keras 为例,可以在 Keras 的官方文档中找到 MNIST 数据集的说明,其中包括了数据集的结构、数据集的下载和解压缩方法、数据集的格式等信息。

具体来说,可以在 Keras 的文档中找到以下内容:

  • keras.datasets.mnist.load_data() 方法的说明,包括了方法的参数、返回值、使用方法等信息。

  • MNIST 数据集的说明,包括了数据集的下载和解压缩方法、数据集的格式、数据集的大小等信息。

  • MNIST 数据集的示例代码,包括了如何使用 MNIST 数据集来训练和评估模型的示例代码。

通过查看文档,可以了解到 MNIST 数据集的结构是一个包含两个元素的元组,第一个元素是一个包含了训练集图像数据和标签数据的元组,第二个元素是一个包含了测试集图像数据和标签数据的元组。

因此,我们可以使用元组解包的方式将这两个元组中的四个数组分别赋值给 X_train、y_train、X_test 和 y_test 四个变量。

将数据转换为float类型并归一化

X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255

这句代码的作用是将训练集的图像数据 X_train 转换为 float32 类型,并将其归一化。

具体来说,

它将 X_train 中的每个像素值除以 255,得到的结果就是一个 0 到 1 之间的浮点数,表示该像素点的亮度值。

这个操作可以将像素值的范围从 0 到 255 缩放到 0 到 1 之间,

使得模型更容易学习到图像中的特征。

在深度学习中,数据的归一化是一种常用的数据预处理方式,它可以使得模型更加稳定、收敛更快、泛化能力更强。

具体来说,归一化可以带来以下几个好处:

提高模型的稳定性:

在深度学习中,模型的训练过程往往是通过梯度下降算法来实现的。如果数据的范围过大,那么在计算梯度时就会出现梯度爆炸的问题,导致模型的训练不稳定。通过归一化可以将数据的范围缩放到一个合适的范围内,避免了梯度爆炸的问题,提高了模型的稳定性。

提高模型的收敛速度:

在深度学习中,模型的训练过程往往需要迭代很多次才能收敛。如果数据的范围过大,那么每次迭代的步长就会很大,导致模型的收敛速度很慢。通过归一化可以将数据的范围缩放到一个合适的范围内,使得每次迭代的步长更加合适,从而提高了模型的收敛速度。

提高模型的泛化能力:

在深度学习中,模型的泛化能力是指模型对未见过的数据的适应能力。如果数据的范围过大,那么模型就会过度拟合训练数据,导致泛化能力不足。通过归一化可以将数据的范围缩放到一个合适的范围内,

在深度学习中,模型的训练过程往往是通过梯度下降算法来实现的。在梯度下降算法中,每次迭代的更新量是由梯度和学习率共同决定的。

如果数据的范围过大,那么在计算梯度时就会出现梯度爆炸的问题,导致模型的训练不稳定。

具体来说,如果数据的范围过大,那么在计算梯度时,梯度的值也会变得很大,从而导致模型的参数更新量也变得很大。

如果更新量过大,就会导致模型的训练不稳定,甚至无法收敛。

因此,为了避免梯度爆炸的问题,需要对数据进行归一化处理,将数据的范围缩放到一个合适的范围内。

<文章来源地址https://www.toymoban.com/news/detail-475372.html

到了这里,关于机器学习第一周:用卷积神经网络实现Mnist手写数字识别(付基础知识解释)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习&&深度学习——卷积神经网络(LeNet)

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习——池化层 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 之前的内容中曾经将softmax回归模型和多层感知机应用于Fashion-MNIST数据集中的服装图片。为了能应用他们,我

    2024年02月14日
    浏览(42)
  • 机器学习算法之——卷积神经网络(CNN)原理讲解

            我们知道神经网络的结构是这样的: 那卷积神经网络跟它是什么关系呢? 其实卷积神经网络依旧是层级网络,只是层的功能和形式做了变化,可以说是传统神经网络的一个改进。比如下图中就多了许多传统神经网络没有的层次。 简而言之,卷积神经网络(Convo

    2024年02月04日
    浏览(51)
  • 【机器学习】——续上:卷积神经网络(CNN)与参数训练

    目录 引入 一、CNN基本结构 1、卷积层 2、下采样层 3、全连接层 二、CNN参数训练 总结 卷积神经网络(CNN)是一种有 监督深度模型框架 ,尤其适合处理 二维数据 问题,如行人检测、人脸识别、信号处理等领域,是带有卷积结构的深度神经网络,也是首个真正意义上成功训练

    2024年02月10日
    浏览(52)
  • 【毕业设计】深度学习花卉识别系统 - 卷积神经网络 机器视觉

    🔥 Hi,大家好,这里是丹成学长的毕设系列文章! 🔥 对毕设有任何疑问都可以问学长哦! 这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定

    2024年02月05日
    浏览(100)
  • 竞赛选题 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享:

    2024年02月08日
    浏览(44)
  • 【机器学习】基于卷积神经网络 CNN 的猫狗分类问题

    卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。 顾名思义,就是将卷积与前馈神经网络结合,所衍生出来的一种深度学习算法。 卷积神经网络CNN的结构图

    2024年02月17日
    浏览(45)
  • 机器学习实验4——CNN卷积神经网络分类Minst数据集

    基于手写minst数据集,完成关于卷积网络CNN的模型训练、测试与评估。 卷积层 通过使用一组可学习的滤波器(也称为卷积核)对输入图像进行滑动窗口卷积操作,这样可以提取出不同位置的局部特征,从而捕捉到图像的空间结构信息。 激活函数 在卷积层之后,通常会应用一

    2024年01月24日
    浏览(52)
  • 竞赛项目 深度学习的口罩佩戴检测 - opencv 卷积神经网络 机器视觉 深度学习

    🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的口罩佩戴检测【全网最详细】 - opencv 卷积神经网络 机器视觉 深度学习 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 从2019年末开始,新型冠状

    2024年02月13日
    浏览(54)
  • 【Python机器学习】实验14 手写体卷积神经网络(PyTorch实现)

    LeNet-5是卷积神经网络模型的早期代表,它由LeCun在1998年提出。该模型采用顺序结构,主要包括7层(2个卷积层、2个池化层和3个全连接层),卷积层和池化层交替排列。以mnist手写数字分类为例构建一个LeNet-5模型。每个手写数字图片样本的宽与高均为28像素,样本标签值是0~

    2024年02月12日
    浏览(52)
  • 机器学习之计算机视觉中的深度学习:卷积神经网络介绍

    文章代码来源:《deep learning on keras》,非常好的一本书,大家如果英语好,推荐直接阅读该书,如果时间不够,可以看看此系列文章。 在这一章,我们会学习卷积神经网络,一种在计算机视觉中常用的深度学习模型,你将会学着将它们运用到分类问题中。 我们首先会介绍卷

    2024年02月04日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包