手写数字识别(mxnet官网例子)
如何利用深度学习技术进行手写数字识别

如何利用深度学习技术进行手写数字识别手写数字识别是计算机视觉领域中一个常见且重要的任务。
利用深度学习技术进行手写数字识别可以使得计算机能够自动识别和分类手写数字图像。
本文将介绍如何利用深度学习技术进行手写数字识别,并讨论其应用和挑战。
深度学习是一种模仿人类大脑神经网络的机器学习算法。
它通过训练神经网络来完成特定任务,如图像识别、语音识别等。
在手写数字识别任务中,深度学习技术能够从大量的手写数字图像中学习到数字的特征,从而实现准确的数字分类。
首先,进行手写数字识别任务前,我们需要一个合适的数据集用于训练和测试模型。
常用的手写数字识别数据集包括MNIST和CIFAR-10等。
其中,MNIST数据集包含了0至9共10个数字的手写图像样本,每个样本都具有相同的尺寸和灰度等级。
CIFAR-10数据集则是包含10个不同类别的图像样本,其中包括了一个手写数字类别。
一种常用的深度学习模型是卷积神经网络(CNN)。
CNN模型由输入层、卷积层、池化层、全连接层和输出层组成。
在手写数字识别任务中,卷积层用于提取图像的特征,池化层用于减少特征图的维度,全连接层用于将特征图映射到分类结果,输出层则给出最终的识别结果。
在训练CNN模型之前,我们需要对输入图像进行预处理。
通常情况下,我们会将图像进行灰度化处理,消除噪声,并将其调整为固定的尺寸。
预处理之后,我们可以将数据集划分为训练集和测试集,一般采用70%的数据作为训练集,30%的数据作为测试集。
接下来,我们可以使用深度学习框架,如TensorFlow或PyTorch,来实现手写数字识别模型。
这些框架提供了一系列高效的函数和工具,用于构建、训练和评估深度学习模型。
可以根据任务需求和硬件资源选择合适的框架。
模型的训练过程中,可以使用反向传播算法来更新模型的参数。
我们可以使用梯度下降法或其他优化算法来最小化模型的损失函数。
在训练过程中,可以设置合适的学习率、迭代次数和批量大小等超参数。
使用神经网络进行手写数字识别的方法

使用神经网络进行手写数字识别的方法随着人工智能的发展,神经网络在图像识别领域发挥了重要作用。
其中,手写数字识别是神经网络应用的一个重要方向。
本文将介绍使用神经网络进行手写数字识别的方法。
一、神经网络的基本原理神经网络是一种模仿人脑神经元网络结构和工作方式的计算模型。
它由输入层、隐藏层和输出层组成,每一层都由多个神经元节点组成。
神经网络通过对输入数据进行加权和激活函数处理,从而输出预测结果。
在手写数字识别中,我们可以将每个手写数字图像作为输入数据,每个像素点的灰度值作为输入特征。
神经网络通过学习大量已标记的手写数字图像,调整权重和偏置,从而实现对手写数字的准确识别。
二、数据预处理在使用神经网络进行手写数字识别之前,需要对数据进行预处理。
首先,我们需要将手写数字图像转换为灰度图像,以减少输入特征的维度。
其次,对图像进行归一化处理,将像素值缩放到0到1之间,以便神经网络更好地学习和处理数据。
除了对图像进行处理,还需要对标签进行处理。
手写数字识别通常使用独热编码(One-Hot Encoding)对标签进行表示。
例如,对于数字0,其独热编码为[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],对于数字1,其独热编码为[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],以此类推。
三、神经网络的构建在构建神经网络时,我们可以选择不同的网络结构和参数设置。
常见的神经网络结构包括多层感知机(Multilayer Perceptron,MLP)、卷积神经网络(Convolutional Neural Network,CNN)等。
以多层感知机为例,我们可以选择输入层节点数、隐藏层节点数、隐藏层数量和输出层节点数等。
通过调整网络结构和参数,可以提高神经网络的准确率和泛化能力。
四、神经网络的训练神经网络的训练是指通过大量的已标记数据,调整网络的权重和偏置,使其能够准确地预测未标记数据的标签。
训练神经网络通常采用反向传播算法(Backpropagation),该算法通过计算预测结果与实际标签之间的误差,然后根据误差调整网络的权重和偏置。
Python程序设计:手写数字识别(案例)

步骤:任务实施
任务 手写数字识别
设计思路
通过sklearn读取手写数字图片数据。 划分训练集和测试集。 创建随机森林分类器并训练模型。 使用网格搜索进行超参数寻优。 查看每一个超参数组合和其对应的分数。 绘制前64张图片,并标定其识别结果,观察识别正确性。
ቤተ መጻሕፍቲ ባይዱ
步骤:任务小结
任务 手写数字识别
机器学习的分类
机器学习算法实现简单图像识别
步骤:任务分析
任务 手写数字识别
需求分析
sklearn中封装有手写数字图片数据集,总共1797条数据。每条数据代表一张 图片,有64个特征,表示这张图片的像素(8*8)。数据集的输出为0-9的类 别,分别表示数字0到9。
现在编写一个程序,建立机器学习算法模型,使用手写数字识别数据集对模型 进行训练并进行超参数寻优。训练结束后,使用模型对图片进行识别,得到识 别结果,将识别结果与真实结果进行对比,观察识别的正确率。
小结
理解训练集与测试集的划分。 了解最优模型的选择。 了解模型中的参数作用。
谢谢观看
手写数字识别
任务 手写数字识别
任务背景
本任务是利用机器学习算法实现手写体数字识别,具体包括数据获取、模型创 建、模型训练、超参数寻优、利用模型进行预测等流程。从本任务出发,我们 将系统的学习机器学习相关知识,包括机器学习的概念、分类、经典的机器学 习算法原理及使用等。
任务 手写数字识别
任务目标
手写数字识别基础训练

手写数字识别基础训练
手写数字识别是一个常见的机器学习问题,可以通过基础训练来实现。
以下是一个手写数字识别的基础训练的例子:
1. 数据集准备:首先,需要准备一个包含手写数字图像和对应标签的数据集。
可以使用MNIST数据集,该数据集包含了大量的手写数字图像和对应的标签。
将数据集分为训练集和测试集。
2. 特征提取:将图像转换为数字特征向量。
可以使用灰度值、图像的边缘、轮廓等作为特征。
常见的特征提取方法有灰度共生矩阵、Histogram of Oriented Gradients (HOG)等。
3. 模型选择:选择一个适合手写数字识别的机器学习模型。
常用的模型有支持向量机(SVM)、k近邻(k-Nearest Neighbors, KNN)、决策树、神经网络等。
本例中以SVM为例。
4. 模型训练:使用训练集对选定的模型进行训练。
通过提取的特征向量和对应标签进行模型训练。
5. 模型评估:使用测试集对训练好的模型进行评估。
计算模型在测试集上的准确率、精度、召回率等指标。
6. 参数调优:根据模型评估结果,可以调整模型的参数或尝试不同的特征提取方法、模型选择方法等来优化模型。
7. 模型应用:使用训练好的模型进行手写数字识别。
将待识别
的手写数字图像转换为特征向量,然后使用训练好的模型进行预测。
需要注意的是,手写数字识别是一个比较简单的机器学习问题,使用基础训练就可以取得较好的结果。
但是,在实际应用中,可能会遇到更复杂的情况,需要借助更高级的模型或者更多的训练数据来提高准确率。
基于 lenet 手写数字体识别实验总结

基于LeNet的手写数字识别实验是计算机视觉领域中一个经典的实例,通过对MNIST数据集进行处理和分析,使用LeNet-5神经网络模型实现对手写数字(0-9)的识别。
以下是对该实验的总结:1. 数据集介绍MNIST数据集是计算机视觉领域的经典入门数据集,包含了60,000个训练样本和10,000个测试样本。
这些数字已经过尺寸标准化并位于图像中心,图像是固定大小(28x28像素)。
数据集分为训练集、验证集和测试集,方便进行模型训练和性能评估。
2. LeNet-5模型LeNet-5是一种卷积神经网络模型,由Yann LeCun于1998年提出。
尽管其提出时间较早,但在手写数字识别任务上取得了显著的成功。
实验中,我们采用LeNet-5模型对MNIST数据集进行处理。
3. 模型结构LeNet-5模型包括两个卷积层和三个全连接层。
卷积层分别包含6个和16个卷积核,卷积核大小为5x5。
每个卷积层之后跟着一个最大池化层,池化核大小为2x2。
全连接层分别具有64、120和84个神经元。
最后,模型输出10个神经元,对应10个数字类别。
4. 实验流程实验中,首先对数据集进行预处理,将图像缩放到28x28像素。
然后,将数据集划分为训练集、验证集和测试集。
接着,构建LeNet-5模型并使用训练集进行训练。
在训练过程中,采用交叉熵损失函数和随机梯度下降(SGD)优化器。
最后,使用验证集评估模型性能,并选取最优模型在测试集上进行测试。
5. 实验结果经过训练,LeNet-5模型在MNIST数据集上取得了较好的识别效果。
在测试集上,模型对数字的识别准确率达到了98.89%。
实验结果表明,尽管LeNet-5模型相对简单,但在手写数字识别任务上具有较高的准确率。
6. 实验总结基于LeNet的手写数字识别实验展示了卷积神经网络在计算机视觉领域的应用。
通过搭建LeNet-5模型并对MNIST数据集进行处理,实验证明了卷积神经网络在识别手写数字方面的有效性。
手写数字识别的卷积神经网络实现方法

手写数字识别的卷积神经网络实现方法手写数字识别一直是计算机视觉领域热门的问题之一,而卷积神经网络(CNN)是实现手写数字识别的有效算法。
在这篇文章中,我们将讨论如何使用卷积神经网络实现手写数字识别。
卷积神经网络是什么?卷积神经网络是一种深度学习模型,它专门用于处理图像。
它具有优秀的特征提取能力和分类能力。
在卷积神经网络中,包含多个卷积层、池化层和全连接层等结构。
其中,卷积层通常用来提取图像中的特征,池化层用于减小特征图的大小,而全连接层则用于分类。
卷积神经网络实现手写数字识别的步骤1. 数据集准备在实现手写数字识别之前,我们需要一个包含手写数字的数据集。
一个常用的数据集是MNIST数据集,它包含大量的手写数字样本。
这些样本被标记为0-9之间的数字,位置规范。
2. 数据集预处理在使用卷积神经网络之前,我们需要对数据集进行预处理。
这通常包括将数据集划分为训练集、验证集和测试集;将图像转化为正确的数据格式,例如灰度图像可以转化为$28*28$的矩阵,RGB彩色图像可以转化为$28*28*3$的张量等。
3. 搭建卷积神经网络模型在准备好数据集后,我们需要搭建卷积神经网络模型。
一个简单的实现可以包括以下层次结构:- 输入层 -接受图像数据;- 卷积层 - 通过逐层学习提取图像中更高级别的特征;- 池化层 - 减小卷积层输出的特征图大小,以减少模型的计算时间和消耗;- Dropout层 - 减少过拟合风险;- Flatten层 - 将卷积层的输出矩阵转换为一维向量;- 全连接层 - 用于分类输出。
4. 模型训练和优化搭建好卷积神经网络模型后,我们需要对它进行训练和优化。
我们可以使用反向传播算法来更新神经网络的权重和偏差。
在训练过程中,我们可以使用准确度、损失函数等指标来监控网络的性能。
为了进一步优化网络性能,我们可以使用正则化技术、批量归一化和调整学习率等方法。
5. 模型评估和预测最后,我们使用验证集来评估模型的性能,并使用测试集进行预测。
MINST手写数字识别(一)——全连接网络
MINST⼿写数字识别(⼀)——全连接⽹络这是⼀个简单快速⼊门教程——⽤Keras搭建神经⽹络实现⼿写数字识别,它⼤部分基于Keras的源代码⽰例 minst_mlp.py.1、安装依赖库⾸先,你需要安装最近版本的Python,再加上⼀些包Keras,numpy,matplotlib和jupyter.你可以安装这些报在全局,但是我建议安装它们在virtualenv虚拟环境,这基本上封装了⼀个完全孤⽴的Python环境。
安装Python包管理器sudo easy_install pip安装virtualenvpip install virtualenv使⽤cd ~进⼊主⽬录,并创建⼀个名为kerasenv的虚拟环境virtualenv kerasenv再激活这个虚拟环境source kerasenv/bin/activate现在你可以安装前⾯提到的包到这个环境pip install numpy jupyter keras matplotlib2、搭建神经⽹络以下代码都在Google Colab中运⾏2.1 导⼊⼀些依赖import numpy as npimport matplotlib.pyplot as pltplt.rcParams['figure.figsize'] = (7,7) # Make the figures a bit biggerfrom keras.datasets import mnistfrom keras.models import Sequentialfrom yers.core import Dense, Dropout, Activationfrom keras.utils import np_utils2.2 装载训练数据nb_classes = 10# the data, shuffled and split between tran and test sets(X_train, y_train), (X_test, y_test) = mnist.load_data()print("X_train original shape", X_train.shape)print("y_train original shape", y_train.shape)结果:Downloading data from https:///img-datasets/mnist.npz11493376/11490434 [==============================] - 0s 0us/stepX_train original shape (60000, 28, 28)y_train original shape (60000,)让我们看看训练集中的⼀些例⼦:for i in range(20):plt.subplot(4,5,i+1)plt.imshow(X_train[i], cmap='gray', interpolation='none')plt.title("Class {}".format(y_train[i]))2.3 格式化训练数据对于每⼀个训练样本我们的神经⽹络得到单个的数组,所以我们需要将28x28的图⽚变形成784的向量,我们还将输⼊从[0,255]缩到[0,1]. X_train = X_train.reshape(60000, 784)X_test = X_test.reshape(10000, 784)X_train = X_train.astype('float32')X_test = X_test.astype('float32')X_train /= 255X_test /= 255print("Training matrix shape", X_train.shape)print("Testing matrix shape", X_test.shape)结果:Training matrix shape (60000, 784)Testing matrix shape (10000, 784)将⽬标矩阵变成one-hot格式0 -> [1, 0, 0, 0, 0, 0, 0, 0, 0]1 -> [0, 1, 0, 0, 0, 0, 0, 0, 0]2 -> [0, 0, 1, 0, 0, 0, 0, 0, 0]etc.Y_train = np_utils.to_categorical(y_train, nb_classes)Y_test = np_utils.to_categorical(y_test, nb_classes)2.4 搭建神经⽹络2.4.1 搭建三层全连接⽹络我们将做⼀个简单的三层全连接⽹络,如下:model = Sequential()model.add(Dense(512, input_shape=(784,)))model.add(Activation('relu')) # An "activation" is just a non-linear function applied to the output# of the layer above. Here, with a "rectified linear unit",# we clamp all values below 0 to 0.model.add(Dropout(0.2)) # Dropout helps protect the model from memorizing or "overfitting" the training data model.add(Dense(512))model.add(Activation('relu'))model.add(Dropout(0.2))model.add(Dense(10))model.add(Activation('softmax')) # This special "softmax" activation among other things,# ensures the output is a valid probaility distribution, that is# that its values are all non-negative and sum to 1.结果:WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.p ython.framework.ops) is deprecated and will be removed in a future version.Instructions for updating:Colocations handled automatically by placer.WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3445: calling dropout (from tensorflow.python. ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.Instructions for updating:Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.2.4.2 编译模型Keras是建⽴在Theano(现在TensorFlow也是),这两个包都允许你定义计算图,然后⾼效地在CPU或GPU上编译和运⾏,⽽没有Python解释器地开销。
分类-MNIST(手写数字识别)
分类-MNIST(⼿写数字识别)这是学习《Hands-On Machine Learning with Scikit-Learn and TensorFlow》的笔记,如果此笔记对该书有侵权内容,请联系我,将其删除。
这⾥⾯的内容⽬前条理还不是特别清析,后⾯有时间会更新整理⼀下。
下⾯的代码运⾏环境为jupyter + python3.6获取数据# from sklearn.datasets import fetch_mldata# from sklearn import datasets# mnist = fetch_mldata('MNIST original')# mnist好像下载不到它的数据,直接从⽹上找到它的数据,放到当⾯⽬录下的\datasets\mldata⽬录下。
MNIST data的百度⽹盘链接: 提取码: 9dq2,如果链接失效,可在下⾯评论区告知我,或者⾃⼰去⽹上找⼀样的,相信各位⼩伙伴的能⼒呀。
输⼊如下代码:from sklearn.datasets import fetch_mldatafrom sklearn import datasetsimport numpy as npmnist = fetch_mldata('mnist-original', data_home = './datasets/')mnist上⾯的代码中的data_home表⽰你的数据集的⽂件路径,写的是⼀个相对路径,如果你没有将你的数据集放在你当前代码的⽬录下,你可能需要使⽤绝对路径。
输出:{'DESCR': ' dataset: mnist-original','COL_NAMES': ['label', 'data'],'target': array([0., 0., 0., ..., 9., 9., 9.]),'data': array([[0, 0, 0, ..., 0, 0, 0],[0, 0, 0, ..., 0, 0, 0],[0, 0, 0, ..., 0, 0, 0],...,[0, 0, 0, ..., 0, 0, 0],[0, 0, 0, ..., 0, 0, 0],[0, 0, 0, ..., 0, 0, 0]], dtype=uint8)}可以看出,我们成功读到了它的数据,⽹上有很多的说法是错误的,没有办法读成功,只有这个才是正解 。
手写数字识别
Better AI, Better Life!
KNN算法(K最近邻居算法)
1
1
11
?
1 1
1
3 3 3
2 2
3 3
2
2
2
2
3 3
2
• 假设已知一些确定了类别的数据,对于一个 未知数据,它的类别由K个最相似的邻居投 票决定。
• 如果K个最相似邻居的大多数属于一个类别, 那么这个未知数据就属于这个类别。
假设K=3: 识别为3 假设K=5: 识别为5
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 81 131 152 194 194 225 98 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 209 253 242 242 242 251 254 183 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 228 95 0 0 0 113 250 254 219 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01141 0 0 0 0 0 80 210 254 16 7 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 075 254 254 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 223 54 161 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 124 254 223 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 082 254 254 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 082 254 254 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 82 254 254 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 115 254 229 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 023 220 254 161 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 82 82 82 82 82 93 254 254 122 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 054 173 254 254 254 254 254 234 254 224 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 010 192 254 192 76 37 151 254 254 254 199 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 135 254 22 111 023 137 254 254 254 254 243 136 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 254 105 0 73 139 254 254 134 24 128 148 18 122 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 254 164 113 210 254 254 135 4 0 0 0 7 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 92 254 254 254 254 22845 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 206 255 255 144 4 0 0 0 0 0 0 0 0 0 0 0 0 0 000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
基于深度学习的手写体数字识别研究与实现
基于深度学习的手写体数字识别研究与实现自动手写体数字识别是计算机视觉领域的一个重要研究方向。
在实际应用中,自动手写体数字识别技术可以广泛应用于银行、保险、学术研究和人机交互等领域。
目前,深度学习算法在手写体数字识别方面已经取得了很大的进展,本文将介绍基于深度学习的手写体数字识别研究与实现。
一、手写体数字识别的基础知识手写体数字识别是将手写的数字字符图像转化为数字字符的过程。
传统的手写体数字识别技术主要包括特征提取、分类器设计和分类模型的训练三个阶段。
其中,特征提取是指从原始的手写数字图像中提取一些用于判别数字的特征,这些特征可以是像素点、直线、曲线、几何形状等。
分类器设计是指根据提取的特征,选择一个合适的分类器来进行数字分类。
而分类模型的训练则是通过大量手写数字数据对分类器进行训练,从而提高分类器的分类能力。
二、基于深度学习的手写体数字识别方法近年来,深度学习算法在计算机视觉领域取得了很大的进展,尤其是在手写体数字识别方面。
基于深度学习的手写体数字识别主要涉及两种架构:卷积神经网络和循环神经网络。
卷积神经网络是一种前馈神经网络,主要用于处理具有网格状结构的数据,如图像、语音波形等。
卷积神经网络的设计灵感来源于生物视觉神经系统对视觉信号的处理方式。
在手写体数字识别方面,卷积神经网络可以有效地利用局部空间和时间相关性信息,从而提高数字分类的准确率。
循环神经网络是一种可以处理时序数据的神经网络,主要用于处理序列数据,如语音信号、文本数据等。
循环神经网络的设计灵感来源于生物神经系统对序列数据的处理方式。
在手写体数字识别方面,循环神经网络可以解决手写数字中的笔画连接问题,从而提高数字的识别率。
三、基于深度学习的手写体数字识别的实现基于深度学习的手写体数字识别需要大量的手写数字数据进行训练,训练数据的规模对模型的准确率影响很大。
一般来说,越多的训练数据可以获得越好的模型效果。
训练数据的获取可以通过自己的手写数字数据集、公开数据集和网络爬虫等方式来实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
手写数字识别
简介:通过MNIST数据集建立一个手写数字分类器。
(MNIST对于手写数据分类任务是一个广泛使用的数据集)。
1.前提:mxnet 0.10及以上、python、jupyter notebook(有时间可以jupyter notebook的用法,如:PPT的制作)
pip install requests jupyter ——python下jupyter notebook 的安装
2.加载数据集:
import mxnet as mx
mnist = mx.test_utils.get_mnist()
此时MXNET数据集已完全加载到内存中(注:此法对于大型数据集不适用)
考虑要素:快速高效地从源直接流数据+输入样本的顺序
图像通常用4维数组来表示:(batch_size,num_channels,width,height)
对于MNIST数据集,因为是28*28灰度图像,所以只有1个颜色通道,width=28,height=28,本例中batch=100(批处理100),即输入形状是(batch_size,1,28,28)
数据迭代器通过随机的调整输入来解决连续feed相同样本的问题。
测试数据的顺序无关紧要。
batch_size = 100
train_iter=mx.io.NDArrayIter(mnist['train_data'],mnist['train_label
'], batch_size, shuffle=True)
val_iter = mx.io.NDArrayIter(mnist['test_data'], mnist['test_label'], batch_size)
——初始化MNIST数据集的数据迭代器(2个:训练数据+测试数据)
3.训练+预测:(2种方法)(CNN优于MLP)
1)传统深度神经网络结构——MLP(多层神经网络)
MLP——MXNET的符号接口
为输入的数据创建一个占位符变量
data = mx.sym.var('data')
data = mx.sym.flatten(data=data)
——将数据从4维变成2维(batch_size,num_channel*width*height) fc1 = mx.sym.FullyConnected(data=data, num_hidden=128)
act1 = mx.sym.Activation(data=fc1, act_type="relu")
——第一个全连接层及相应的激活函数
fc2 = mx.sym.FullyConnected(data=act1, num_hidden = 64)
act2 = mx.sym.Activation(data=fc2, act_type="relu")
——第二个全连接层及相应的激活函数
(声明2个全连接层,每层有128个和64个神经元)
fc3 = mx.sym.FullyConnected(data=act2, num_hidden=10) ——声明大小10的最终完全连接层
mlp = mx.sym.SoftmaxOutput(data=fc3, name='softmax')
——softmax的交叉熵损失
MNIST的MLP网络结构
以上,已完成了数据迭代器和神经网络的申明,下面可以进行训练。
超参数:处理大小、学习速率
import logging
logging.getLogger().setLevel(logging.DEBUG) ——记录到标准输出
mlp_model = mx.mod.Module(symbol=mlp, context=mx.cpu()) ——在CPU上创建一个可训练的模块
mlp_model.fit(train_iter ——训练数据
eval_data=val_iter, ——验证数据
optimizer='sgd', ——使用SGD训练
optimizer_params={'learning_rate':0.1}, ——使用
固定的学习速率
eval_metric='acc', ——训练过程中报告准确性
batch_end_callback=mx.callback.Speedometer(ba
tch_size, 100), ——每批次100数据输出的进展
num_epoch=10) ——训练至多通过10个数据
预测:
test_iter = mx.io.NDArrayIter(mnist['test_data'], None, batch_size) prob = mlp_model.predict(test_iter)
assert prob.shape == (10000, 10)
——计算每一个测试图像可能的预测得分(prob[i][j]第i个测试图像包含j输出类)
test_iter = mx.io.NDArrayIter(mnist['test_data'], mnist['test_label'], batch_size) ——预测精度的方法
acc = mx.metric.Accuracy()
mlp_model.score(test_iter, acc)
print(acc)
assert acc.get()[1] > 0.96
如果一切顺利的话,我们将看到一个准确的值大约是0.96,这意味着我们能够准确地预测96%的测试图像中的数字。
2)卷积神经网络(CNN)
卷积层+池化层
data = mx.sym.var('data')
conv1 = mx.sym.Convolution(data=data, kernel=(5,5), num_filter=20)
tanh1 = mx.sym.Activation(data=conv1, act_type="tanh")
pool1 = mx.sym.Pooling(data=tanh1, pool_type="max", kernel=(2,2), stride=(2,2))
——第一个卷积层、池化层
conv2 = mx.sym.Convolution(data=pool1, kernel=(5,5), num_filter=50) ——第二个卷积层tanh2 = mx.sym.Activation(data=conv2, act_type="tanh")
pool2 = mx.sym.Pooling(data=tanh2, pool_type="max", kernel=(2,2), stride=(2,2))
flatten = mx.sym.flatten(data=pool2) ——第一个全连接层
fc1 = mx.symbol.FullyConnected(data=flatten, num_hidden=500) tanh3 = mx.sym.Activation(data=fc1, act_type="tanh")
fc2 = mx.sym.FullyConnected(data=tanh3, num_hidden=10)——第二个全连接层
lenet = mx.sym.SoftmaxOutput(data=fc2, name='softmax') ——Softmax损失
LeNet第一个卷积层+池化层
lenet_model = mx.mod.Module(symbol=lenet, context=mx.cpu()) ——在GPU上创建一个可训练的模块
lenet_model.fit(train_iter,
eval_data=val_iter,
optimizer='sgd',
optimizer_params={'learning_rate':0.1},
eval_metric='acc',
batch_end_callback = mx.callback.Speedometer(batch_size, 100),
num_epoch=10)
——训练(同MLP)
test_iter = mx.io.NDArrayIter(mnist['test_data'], None, batch_size) prob = lenet_model.predict(test_iter)
test_iter = mx.io.NDArrayIter(mnist['test_data'], mnist['test_label'], batch_size)
acc = mx.metric.Accuracy() ——预测LeNet的准确性lenet_model.score(test_iter, acc)
print(acc)
assert acc.get()[1] > 0.98
使用CNN,我们能够正确地预测所有测试图像的98%左右。
附:完整代码1)MLP
2)CNN。