CN110378383B - 一种基于Keras框架和深度神经网络的图片分类方法 - Google Patents
一种基于Keras框架和深度神经网络的图片分类方法 Download PDFInfo
- Publication number
- CN110378383B CN110378383B CN201910529685.1A CN201910529685A CN110378383B CN 110378383 B CN110378383 B CN 110378383B CN 201910529685 A CN201910529685 A CN 201910529685A CN 110378383 B CN110378383 B CN 110378383B
- Authority
- CN
- China
- Prior art keywords
- layer
- function
- size
- neural network
- picture
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/50—Information retrieval; Database structures therefor; File system structures therefor of still image data
- G06F16/55—Clustering; Classification
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F18/00—Pattern recognition
- G06F18/20—Analysing
- G06F18/21—Design or setup of recognition systems or techniques; Extraction of features in feature space; Blind source separation
- G06F18/214—Generating training patterns; Bootstrap methods, e.g. bagging or boosting
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F18/00—Pattern recognition
- G06F18/20—Analysing
- G06F18/24—Classification techniques
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Evolutionary Computation (AREA)
- Life Sciences & Earth Sciences (AREA)
- Artificial Intelligence (AREA)
- Computing Systems (AREA)
- Software Systems (AREA)
- Molecular Biology (AREA)
- Computational Linguistics (AREA)
- Biophysics (AREA)
- Biomedical Technology (AREA)
- Mathematical Physics (AREA)
- General Health & Medical Sciences (AREA)
- Health & Medical Sciences (AREA)
- Bioinformatics & Cheminformatics (AREA)
- Bioinformatics & Computational Biology (AREA)
- Computer Vision & Pattern Recognition (AREA)
- Evolutionary Biology (AREA)
- Databases & Information Systems (AREA)
- Image Analysis (AREA)
Abstract
本发明公开了一种基于Keras框架和深度神经网络的图片分类方法,包括对图片数据的预处理;通过构建卷积神经网络和全连接神经网络来训练模型,对手写数字图片数据进行识别。本发明充分利用Keras框架的高度模块化,极简和快速实验的优点,运用卷积神经网络的结构,解决以往研究人员事先确定参数以及每层维度的问题,进一步提高做实验的效率,从而减少研究人员实验时间并且提高手写数字识别准确性。
Description
技术领域
本发明属于计算机应用技术领域,具体是一种基于Keras框架和深度神经网络的图片分类方法。
背景技术
深度学习的概念源于人工神经网络的研究,含多隐层的多层感知器就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。深度学习的概念由Hinton等人于2006年提出,基于深度置信网络(DBN) 提出非监督贪心逐层训练算法,为解决深层结构相关的优化难题带来希望,随后提出多层自动编码器深层结构。此外Lecun等人提出的卷积神经网络是第一个真正多层结构学习算法,它利用空间相对关系减少参数数目以提高训练性能。深度学习是机器学习中一种基于对数据进行表征学习的方法,观测值(例如一幅图像)可以使用多种方式来表示,如每个像素强度值的向量,或者更抽象地表示成一系列边、特定形状的区域等,而使用某些特定的表示方法更容易从实例中学习任务(例如,人脸识别或面部表情识别)。
Keras是基于Theano的一个深度学习框架,也是一个高层神经网络API,它的设计参考Torch,使用纯Python编写而成并基于Tensorflow和CNTK后端。Keras为支持快速实验而生,能够把你的idea迅速转换为结果,是一个高度模块化的神经网络库,支持GPU和 CPU处理器。然而,以往研究采用Keras方法进行图片识别过程中存在需要事先确定参数以及每层维度的问题,代码执行效率低,图片分类效果不佳。
发明内容
针对上述技术问题的不足,本发明提出了一种基于Keras框架和深度神经网络的图片分类方法。
本发明的构思是:做深度学习,首先要有数据进行训练和测试,也就是训练集和测试集,本发明的数据集包括训练集、验证集和测试集,总共有55000个训练样本,5000个验证样本和10000个测试样本,每个样本是由数字图片和一个真实值组成,图片是黑白的,像素是28*28,m个样本数据是二维数据(m,784)。数据集需要先从网址 https://s3.amazonaws.com/img-datasets/mnist.npz网站中下载,将下载成功的mnist.npz文件放在D:\keras-mnis目录中,再通过keras.datasets.mnist.load_data函数加载 D:\keras-mnis\mnist.npz数据集,函数中的path参数是下载数据集的目录地址,该函数返回两个元组,第一个元组是训练集数据和对应的类别号,第二个元组是测试集数据和对应的类别号,训练集和测试集的类别号都是一个数字(0-9),需要把每个数字转换成对应的one-hot 编码,因为有10个类别0-9,所以每个样本的真实值由10个0和1组成,图片上数字是在对应的索引上为1,其他为0;由于后面的代码编写需要one-hot编码的真实值,所以我们需要对进真实值进行one-hot编码。
通过上述的步骤,得到mnist数据集,并且将类别号进行one-hot编码,接下来需要创建模型以及训练模型。先通过keras.models.Sequential对象创建序贯模型model,序贯模型是函数式模型的简略版,为最简单的线性、从头到尾的结构顺序,不分叉,是多个网络层的线性堆叠;通过函数model.add(Conv2D(filters=64,kernel_size=(3,3),strides=(1,1), padding='same',input_shape=(28,28,1),activation='relu'))来构建第一层卷积神经网络的卷积层,构建了64个卷积核(filters窗口),对每个图片使用64个卷积核进行计算,得到64个结果,即64个图片,每个卷积核的大小是3*3(kernel_size),移动的步长是1*1(strides),即左右移动和上下移动都是1个像素,padding=’same’表示输入的图片大小跟输出的图片大小一致,通过零填充来保证大小一致,input_shape=(28,28,1)表示输入的图片大小是28*28*1,其中的1表示图片是1通道,即黑白图片,activation='relu'表示激活函数是relu函数,激活函数是为了增加网络的非线性分割能力,而采用Relu激活函数,整个过程的计算量节省很多,并且不会出现梯度消失的情况;构建好第一层卷积神经网络的卷积层后,需要对卷积层的结果进行池化,也就是进入池化层,通过model.add(MaxPooling2D(pool_size=(2,2)))函数进行池化,池化的窗口是2*2,移动步长默认是1*1,即左右移动和上下移动都是1个像素,将2*2四个像素中选取其中最大的一个值作为一个代表像素;接下来是第一层卷积神经网络的DropOut层,调用model.add(Dropout(0.5))函数,以概率0.5保留每个神经元节点,为了防止或减轻过拟合而使用的函数,Dropout就是在不同的训练过程中随机扔掉一部分神经元,也就是让某个神经元以一定的概率p让其工作,这次训练过程中不更新权值,也不参加神经网络的计算,但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了。
完成上述的第一层卷积神经网络,接下来是构建第二层卷积神经网络,使用的数据是第一层卷积神经网络得到的数据。继续使用model对象构建第二层卷积神经网络的卷积层,通过model.add(Conv2D(128,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')) 函数构造卷积层,参数128表示卷积核个数是128个,kernel_size=(3,3)表示卷积核的大小是3*3,每个图片与128个大小为3*3卷积核相乘,得到128个图片,strides=(1,1)表示每个卷积核移动的步长,即左右移动和上下移动的步长都是1个像素,padding='same'表示经过卷积计算后,输入的图片大小与输出的图片大小一致,通过零填充来保存输入和输出的图片大小一致,activation='relu'表示将卷积后的结果使用relu激活函数进行激活,只是改变结果的值,维度不改变,relu激活函数的优点在第一层卷积神经网络已经说明;经过卷积层后,跟第一层卷积神经网络类似,接下来是池化层和使用DropOut函数处理,通过函数 model.add(MaxPooling2D(pool_size=(2,2)))对卷积层得到的结果进行池化,所使用的窗口大小是2*2像素面积,默认左右移动和上下移动的步长是1,在每个窗口中选出最大的一个像素值作为代表值,因此图片的缩小为原来的4倍;经过池化后,通过model.add(Dropout(0.5)) 函数对池化得到的结果进行选取一些神经元,这样的好处是避免或减轻过拟合的现象,详细的过程在第一层卷积神经网络中已详细说明。
完成第二层卷积神经网络后,接下来是构建第三层卷积神经网络,使用的数据是第二层卷积神经网络得到的数据。继续使用model.add(Conv2D(256,kernel_size=(3,3),strides=(1,1), padding='same',activation='relu'))函数构建第三层卷积神经网络的卷积层,256表示使用256 个卷积核,每个图片都与256个卷积核进行计算,得到256个结果,kernel_size=(3,3)表示每个卷积核的大小为3*3,strides=(1,1)表示每个卷积核左右移动和上下移动的步长是1个像素,padding='same'表示经过卷积层后,输入图片的大小和输出图片的大小一致,通过零补充来保证输出图片和输入图片的大小一致,activation='relu'表示将卷积计算的结果通过激活函数relu来激活,通过激活函数relu可以让计算量大大减少并且不会出现梯度消失的情况,而sigmoid函数的计算量不会减少并且会出现梯度消失,这是我选择relu激活函数的理由;经过卷积层后,还有池化层和使用DropOut函数进行处理,通过 model.add(MaxPooling2D(pool_size=(2,2)))函数进行池化,池化的窗口大小是2*2,默认的移动步长是1*1,即左右移动和上下移动的步长是1个像素,每次移动窗口选出其中最大的一个像素点作为代表值,池化前后的图片大小缩小了4倍;最后执行DropOut函数,以概率0.5保留每个神经元,DropOut好处是避免或减轻过拟合的情况。
经过上述的三层卷积神经网络后,接下来是三层的全连接神经网络。全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来,由于其全相连的特性,一般全连接层的参数也是最多的,全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。通过model.add(Dense(128,activation='relu'))函数创建第一层全连接层,参数128表示该层上的节点数是128,activation='relu'表示将计算得到的结果再通过激活函数relu,激活函数relu的作用和好处在前面已说明;创建完第一层全连接层后,再通过 model.add(Dense(64,activation='relu'))函数创建第二层全连接层,64表示该层的神经元个数为64,activation='relu'表示将计算得到的结果再通过激活函数relu;创建完第二层全连接层后,通过model.add(Dense(32,activation='relu'))函数创建第三层全连接层,32表示该层的神经元个数是32,activation='relu'表示将计算得到的结果再通过激活函数relu。到止为止,三层的全连接层已全部创建。
经过上述的三层卷积神经网络和三层全连接层后,接下来就是最后一层,即输出层。因为数字图片识别有10个类别(0-9),每个图片有10个可能性,所以输出层的节点数是10,通过model.add(Dense(10,activation='softmax'))函数创建输出层,参数10表示该输出层有10个神经元,activation='softmax'表示将10个结果转换成10个概率,每个概率对应每个类别的概率,概率最大的表示该图片数字是该索引号。经过最后一层后,就要计算损失大小,通过降低损失来训练好模型,通过model.compile(optimizer='adagrad',loss='categorical_cr ossentropy',metrics=['accuracy'])函数来计算损失,optimizer='adagrad'表示采用adagrad优化器, loss='categorical_crossentropy'表示采用多类的对数损失,使用交叉熵损失,metrics=['accuracy'] 表示评估模型在训练和测试时的性能指标,参数是一个列表,可以使用多个不同的指标来评估模型,这里使用准确率(accuracy)来评估模型。定义好损失函数后,就可以使用model 对象来训练数据,通过model.fit(X_train,y_train_one,validation_data=(X_test,y_test_one),epoc hs=20,batch_size=128)来训练数据,X_train,y_train_one分别是训练集和训练集对应的真实值 one-hot编码,validation_data=(X_test,y_test_one)是验证集,这里的验证集就是采用测试集, X_test,y_test_one分别是测试集和测试集对应的真实值one-hot编码,epochs=20表示将所有训练集训练20遍,batch_size=128表示每次批处理的记录数是128条,最后通过scores= model.evaluate(X_test,y_test_ohe,verbose=0)函数测试结果,X_test,y_test_one分别是测试集数据和测试集对应的真实值one-hot编码,verbose=0表示进度方式,训练中控制台不显示数据,该函数返回测试集的准确率。
根据上述构思,实现该发明的技术方案主要有以下两点:
(1)深度计算:首先创建三个卷积神经网络,每层的卷积核个数分别是64、128和256,每层的卷积核大小都是3*3,每层卷积核移动步长都是1*1,并且三层卷积神经网络的激活函数都是relu激活函数;经过三层卷积神经网络后,接着是三层全连接神经网络,每层的神经元个数分别是128,64,和32,并且各层的激活函数都是relu激活函数;经过三层全连接神经网络后接着是最后一层,即输出层,该层激活函数是softmax函数。
(2)权重计算:在Keras框架中,不需要首先声明权重w和偏置b,只需要通过一些API来创建卷积层、池化层、Dropout对象、全连接层和输出层,不需要考虑参数的维度。在权重计算过程中,接触不到权重值w和偏置值b,Keras框架自动帮我们计算权重w和偏置b,框架内部通过训练集的预测值和真实值得到交叉熵损失,再降低损失来保证模型的准确性。
在以上两项内容的配合使用下所产生的主要有益效果是:
(1)代码结构简明清晰,易于阅读,代码执行效率高,能够把你的实验思路迅速转换为结果;
(2)不需事先确定参数及每个神经网络层的维度,经过三层卷积神经网络、三层全连接层和输出层,形成一个成熟的模型,图片分类的准确率高。
(3)本发明的一种基于Keras框架和深度神经网络的图片分类方法,包括对图片数据的预处理;通过构建卷积神经网络和全连接神经网络来训练模型,对手写数字图片数据进行识别。本发明充分利用Keras框架的高度模块化,极简和快速实验的优点,运用卷积神经网络的结构,一方面解决了以往研究人员事先确定参数以及每层维度的问题,另一方面进一步提高做实验的效率,从而减少研究人员实验时间并且提高手写数字识别准确性,并且编写代码快速易懂,代码执行效率高,实现研究人员快速便捷地实现图片。
附图说明
图1是本发明中的一种基于Keras框架与深度神经网络的图片分类方法的代码流程图;
图2是本发明中的测试集准确率图。
具体实施方式
下面结合附图对本发明的具体实施方式进行描述,以便本领域的技术人员更好的理解本发明。需要特别提醒注意的是,在以下的描述中,当已知功能和设计的详细描述也许会淡化本发明的主要内容时,这些描述在这里将被忽略。
如图1所示,本发明的一种基于Keras框架和深度神经网络的图片分类方法,包括以下步骤:
一种基于Keras框架和深度神经网络的图片分类方法,包括下列四大步骤:
步骤1:手写数字图像数据集的预处理,首先将手写数字图像数据集划分为训练集、测试集,然后对其进行维度修改,并对标签数据进行one-hot编码;
步骤2:通过Keras框架构建三层卷积神经网络,设置每层卷积神经网络的卷积核个数、卷积核大小、激活函数和池化层;
步骤3:通过Keras框架构建三层全连接层和输出层,设置每层全连接层和输出层的神经元个数;
步骤4:,调用Keras框架的API构建损失函数,并在训练集上进行训练,得到的模型在测试集上进行测试,得出准确率;
上述步骤1中包含下列步骤:
步骤1.1:在步骤1中是对数据集进行预处理。首先获得数据集,本实验的数据集是一个手写数字数据库,包含训练集和测试集,总共有55000个训练样本,5000个验证样本和10000个测试样本,每个样本是由数字图片和一个真实值组成,图片是黑白的,像素是28*28。数据集需要先从网址https://s3.amazonaws.com/img-datasets/mnist.npz网站中下载,将下载成功的mnist.npz文件放在D:\keras-mnis目录中,再通过keras.datasets.mnist.load_data函数加载D:\keras-mnis\mnist.npz数据集,函数中的path参数是下载数据集的目录地址,该函数返回两个元组,第一个元组是训练集数据和对应的类别号,第二个元组是测试集数据和对应的类别号,训练集和测试集的类别号都是一个数字(0-9);
步骤1.2:在步骤1.1中获得训练集和测试集的真实值数字(0-9),后面的编码需要将真实值数字转换成one-hot编码。通过手写的函数将每个数字转换为由10个0或1组成的序列,图片上数字是在对应的索引上为1,其他为0。
上述步骤2中包含下列步骤:
步骤2.1:在上述步骤1中获得了数据集,接下来需要构建三层卷积神经网络。首先创建第一层卷积神经网络,通过函数model.add(Conv2D(filters=64,kernel_size=(3,3),strides=(1,1 ),padding='same',input_shape=(28,28,1),activation='relu'))来构建第一层卷积神经网络的卷积层,构建了64个卷积核(filters窗口),对每个图片使用64个卷积核进行计算,得到64个结果,即64个图片,每个卷积核的大小是3*3(kernel_size),移动的步长是1*1(strides),即左右移动和上下移动都是1个像素,padding=’same’表示输入的图片大小跟输出的图片大小一致,通过零填充来保证大小一致,input_shape=(28,28,1)表示输入的图片大小是28*28*1, 其中的1表示图片是1通道,即黑白图片,activation='relu'表示激活函数是relu函数,激活函数是为了增加网络的非线性分割能力,而采用Relu激活函数,整个过程的计算量节省很多,并且不会出现梯度消失的情况;通过model.add(MaxPooling2D(pool_size=(2,2)))函数进行池化,池化的窗口是2*2,移动步长默认是1*1,即左右移动和上下移动都是1个像素,将2*2四个像素中选取其中最大的一个值作为一个代表像素;接下来是第一层卷积神经网络的DropOut层,调用model.add(Dropout(0.5))函数,以概率0.5保留每个神经元节点,为了防止或减轻过拟合而使用的函数,Dropout就是在不同的训练过程中随机扔掉一部分神经元,也就是让某个神经元以一定的概率p让其工作,这次训练过程中不更新权值,也不参加神经网络的计算,但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了,激活函数如公式(1)所示:
步骤2.2:在步骤2.1中构建了第一层卷积神经网络后,接下来再构建第二层卷积神经网络。通过model.add(Conv2D(128,kernel_size=(3,3),strides=(1,1),padding='same',activation='re lu'))函数构造卷积层,参数128表示卷积核个数是128个,kernel_size=(3,3)表示卷积核的大小是3*3,每个图片与128个大小为3*3卷积核相乘,得到128个图片,strides=(1,1)表示每个卷积核移动的步长,即左右移动和上下移动的步长都是1个像素,padding='same'表示经过卷积计算后,输入的图片大小与输出的图片大小一致,通过零填充来保存输入和输出的图片大小一致,activation='relu'表示将卷积后的结果使用relu激活函数进行激活,只是改变结果的值,维度不改变,relu激活函数的优点在第一层卷积神经网络已经说明;经过卷积层后,跟第一层卷积神经网络类似,接下来是池化层和使用DropOut函数处理,通过函数 model.add(MaxPooling2D(pool_size=(2,2)))对卷积层得到的结果进行池化,所使用的窗口大小是2*2像素面积,默认左右移动和上下移动的步长是1,在每个窗口中选出最大的一个像素值作为代表值,因此图片的缩小为原来的4倍;经过池化后,通过model.add(Dropout(0.5)) 函数对池化得到的结果进行选取一些神经元,这样的好处是避免或减轻过拟合的现象,详细的过程在步骤2.1中已详细说明。
步骤2.3:在步骤2.2中构建了第一层卷积神经网络后,接下来再构建第三层卷积神经网络。继续使用model.add(Conv2D(256,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu'))函数构建第三层卷积神经网络的卷积层,256表示使用256 个卷积核,每个图片都与256个卷积核进行计算,得到256个结果,kernel_size=(3,3)表示每个卷积核的大小为3*3,strides=(1,1)表示每个卷积核左右移动和上下移动的步长是1个像素,padding='same'表示经过卷积层后,输入图片的大小和输出图片的大小一致,通过零补充来保证输出图片和输入图片的大小一致,activation='relu'表示将卷积计算的结果通过激活函数relu来激活,通过激活函数relu可以让计算量大大减少并且不会出现梯度消失的情况,而sigmoid函数的计算量不会减少并且会出现梯度消失,这是我选择relu激活函数的理由;经过卷积层后,还有池化层和使用DropOut函数进行处理,通过 model.add(MaxPooling2D(pool_size=(2,2)))函数进行池化,池化的窗口大小是2*2,默认的移动步长是1*1,即左右移动和上下移动的步长是1个像素,每次移动窗口选出其中最大的一个像素点作为代表值,池化前后的图片大小缩小了4倍;最后执行DropOut函数,以概率0.5保留每个神经元,DropOut好处是避免或减轻过拟合的情况。
上述步骤3中包含下列步骤:
步骤3.1:在步骤2中完成三层卷积神经网络,接下来需要构建三层全连接层。首先构建第一层全连接层,全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来,由于其全相连的特性,一般全连接层的参数也是最多的,全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。通过model.add(Dense(128,activation='relu'))函数创建第一层全连接层,参数128表示该层上的节点数是128,activation='relu'表示将计算得到的结果再通过激活函数relu,激活函数relu的作用和好处在前面已说明;
步骤3.2:构建完第一层全连接层后,再通过model.add(Dense(64,activation='relu'))函数创建第二层全连接层,64表示该层的神经元个数为64,activation='relu'表示将计算得到的结果再通过激活函数relu;
步骤3.3::构建完第二层全连接层后,通过model.add(Dense(32,activation='relu'))函数构建第三层全连接层,32表示该层的神经元个数是32,activation='relu'表示将计算得到的结果再通过激活函数relu。到止为止,三层的全连接层已全部创建。
步骤3.4:构建完上述的三层全连接层后,接下来就是最后一层,即输出层。因为数字图片识别有10个类别(0-9),每个图片有10个可能性,所以输出层的节点数是10,通过model.add(Dense(10,activation='softmax'))函数创建输出层,参数10表示该输出层有10个神经元,activation='softmax'表示将10个结果转换成10个概率,每个概率对应每个类别的概率,概率最大的表示该图片数字是该索引号,softmax函数如公式(2)所示:
其中:j表示第几个神经元,Zj表示第j个神经元的输出,K表示总共的神经元个数,σ(z)j表示第j个神经元输出所表示的概率。
上述步骤4中包含下列步骤:
步骤4.1:完成步骤3中的输出层构建后,接下来就要计算损失大小,通过降低损失来训练好模型,通过model.compile(optimizer='adagrad',loss='categorical_crossentropy',metrics=[ 'accuracy'])函数来计算损失,optimizer='adagrad'表示采用adagrad优化器,loss='categorical_ crossentropy'表示采用多类的对数损失,使用交叉熵损失,metrics=['accuracy']表示评估模型在训练和测试时的性能指标,参数是一个列表,可以使用多个不同的指标来评估模型,这里使用准确率(accuracy)来评估模型,交叉熵损失函数如公式(3)所示:
其中:n表示样本总数,j表示第j个样本,m表示每个样本的类别数,i表示第i个类别, yj表示第j个样本的真实值,Zi表示第j个样本的预测输出。
步骤4.2:定义好损失函数后,就可以使用model对象来训练数据,通过model.fit(X_train,y _train_one,validation_data=(X_test,y_test_one),epochs=20,batch_size=128)来训练数据,X_trai n,y_train_one分别是训练集和训练集对应的真实值one-hot编码,validation_data=(X_test,y_te st_one)是验证集,这里的验证集就是采用测试集,X_test,y_test_one分别是测试集和测试集对应的真实值one-hot编码,epochs=20表示将所有训练集训练20遍,batch_size=128表示每次批处理的记录数是128条;
步骤4.3:最后通过scores=model.evaluate(X_test,y_test_ohe,verbose=0)函数测试结果, X_test,y_test_one分别是测试集数据和测试集对应的真实值one-hot编码,verbose=0表示进度方式,训练中控制台不显示数据,该函数返回测试集的准确率。
如图1所示,本发明的一种基于Keras框架和深度神经网络的图片分类方法中,主要四个实施步骤如下:
S1:数据获取
本发明中的实验数据集采用的是MNIST数据集,数据集来源于美国国家标准与技术研究所(National Institute of Standards and Technology(NIST)),其中训练数据集总包含60000个样本,训练数据集包含55000个样本,验证集包含5000个样本,测试数据集包含10000个样本,在MNIST数据集中的每张图片由28×28个像素点构成,每个像素点用一个灰度值表示,共有10个类标签(整数0-9)在该数据集上。通过函数keras.datasetsmnist.load_data("D:\k eras-mnist\mnist.npz")获得训练集和测试集,以及对应的图片数字。
S2:构建卷积神经网络层
获得数据集后,接下来就是构建卷积神经网络层。通过函数model.add(Conv2D(filters=64, kernel_size=(3,3),strides=(1,1),padding='same',input_shape=(28,28,1),activation='relu'))来构建第一层卷积神经网络的卷积层,构建了64个卷积核(窗口),每个卷积核的大小是 3*3(kernel_size),移动的步长是1*1(strides),即左右移动和上下移动都是1个像素,padding=’ same’使卷积前后的图片大小一致,input_shape=(28,28,1)表示输入的图片大小是28*28*1, 其中的1表示图片是1通道,即黑白图片,activation='relu'表示激活函数是relu函数,构建好第一层卷积神经网络的卷积层后,通过model.add(MaxPooling2D(pool_size=(2,2)))函数进行池化,池化的窗口是2*2,移动步长默认是1*1,即左右移动和上下移动都是1个像素,将2*2四个像素中选取其中最大的一个值作为一个代表像素;接下里通过调用 model.add(Dropout(0.5))函数来防止或减轻过拟合的情况。第二层和第三层卷积神经网络与第一层卷积神经网络类似,只是第二层和第三层卷积神经网络的卷积核个数分别是128和 256,其他设置都是一样的。
S3:构建全连接层和输出层
通过model.add(Dense(128,activation='relu'))函数创建第一层全连接层,参数128表示该层上的神经元个数是128,activation='relu'表示将计算得到的结果再通过激活函数relu,创建完第一层全连接层后,第二层和第三层全连接层跟第一层类似,只有第二层和第三层的神经元个数分别是64和32。
S4:训练模型,计算准确率
通过model.compile(optimizer='adagrad',loss='categorical_crossentropy',metrics=['accuracy']) 函数来计算损失,optimizer='adagrad'表示采用adagrad优化器,loss='categorical_crossentropy' 表示采用多类的对数损失,使用交叉熵损失,metrics=['accuracy']表示评估模型在训练和测试时的性能指标。定义好损失函数后,就可以使用model对象来训练数据,通过 model.fit(X_train,y_train_one,validation_data=(X_test,y_test_one),epochs=20,batch_size=128) 来训练数据,X_train,y_train_one分别是训练集和训练集对应的真实值one-hot编码, validation_data=(X_test,y_test_one)是验证集,这里的验证集就是采用测试集, X_test,y_test_one分别是测试集和测试集对应的真实值one-hot编码,epochs=20表示将所有训练集训练20遍,batch_size=128表示每次批处理的记录数是128条,最后通过scores=model.evaluate(X_test,y_test_ohe,verbose=0)函数测试结果,X_test,y_test_one分别是测试集数据和测试集对应的真实值one-hot编码,verbose=0表示进度方式,训练中控制台不显示数据,该函数返回测试集的准确率,如图2所示。
综上,本发明设计一种基于keras框架和深度神经网络的图片分类方法。编写Keras框架的代码时,Keras框架提供一致而简洁的API,能够极大减少一般应用下用户的工作量。另一方面,简易和快速的原型设计,添加新模块超级容易,只需要仿照现有的模块编写新的类或函数,更有助于编写模型代码,更容易上手,与其他框架对比,解决以往研究人员事先确定参数以及每层维度的问题,更有助于研究人员更快速更便捷地实现图片分类。
Claims (4)
1.一种基于Keras框架和深度神经网络的图片分类方法,其特征在于,包括步骤:
手写数字图像数据集的预处理,首先将手写数字图像数据集划分为训练集、测试集,然后对其进行维度修改,并对标签数据进行one-hot编码;通过Keras框架构建三层卷积神经网络,设置每层卷积神经网络的卷积核个数、卷积核大小、激活函数和池化层;进一步通过Keras框架构建三层全连接层和输出层,设置每层全连接层和输出层的神经元个数;最后调用Keras框架的API构建损失函数,并在训练集上进行训练,得到的模型在测试集上进行测试,得出准确率;
通过Keras框架构建三层卷积神经网络的具体步骤为:
步骤2.1:在获得了数据集后,接下来需要构建三层卷积神经网络,首先创建第一层卷积神经网络,通过函数model.add(Conv2D(filters=64,kernel_size=(3,3),strides=
(1,1),padding='same',input_shape=(28,28,1),activation='relu'))来构建第一层卷积神经网络的卷积层,Conv2D是keras库中的函数,用于创建卷积核,filters=64表示构建了64个卷积核,对每个图片使用64个卷积核进行计算,得到64个结果,即64个图片,kernel_size=(3,3)表示每个卷积核的大小是3*3,strides=(1,1)表示每个卷积核左右移动和上下移动的步长是1个像素,padding=’same’表示输入的图片大小跟输出的图片大小一致,通过零填充来保证大小一致,input_shape=(28,28,1)表示输入的图片大小是28*28*1,其中的1表示图片是1通道,即黑白图片,activation='relu'表示激活函数是relu函数,激活函数是为了增加网络的非线性分割能力,而采用Relu激活函数,整个过程的计算量节省很多,并且不会出现梯度消失的情况;通过model.add(MaxPooling2D(pool_size=(2,2)))函数进行池化,MaxPooling2D是keras库中的函数,用于对卷积层得到的数据进行池化,具体含义为:池化的窗口是2*2,移动步长默认是1*1,即左右移动和上下移动都是1个像素,将2*2四个像素中选取其中最大的一个值作为一个代表像素;接下来是第一层卷积神经网络的DropOut层,调用model.add(Dropout(0.5))函数,以概率0.5保留每个神经元节点,Dropout就是在不同的训练过程中随机扔掉一部分神经元,也就是让某个神经元以一定的概率p让其工作,这次训练过程中不更新权值,也不参加神经网络的计算,但是它的权重得保留下来,激活函数如公式(1)所示:
步骤2.2:在步骤2.1中构建了第一层卷积神经网络后,接下来再构建第二层卷积神经网络,通过model.add(Conv2D(128,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu'))函数构造卷积层,参数128表示卷积核个数是128个,kernel_size=(3,3)表示卷积核的大小是3*3,每个图片与128个大小为3*3卷积核相乘,得到128个图片,strides=(1,1)表示每个卷积核移动的步长,即左右移动和上下移动的步长都是1个像素,padding='same'表示经过卷积计算后,输入的图片大小与输出的图片大小一致,通过零填充来保存输入和输出的图片大小一致,activation='relu'表示将卷积后的结果使用relu激活函数进行激活,只是改变结果的值,维度不改变,relu激活函数的优点在第一层卷积神经网络已经说明;经过卷积层后,跟第一层卷积神经网络类似,接下来是池化层和使用DropOut函数处理,通过函数model.add(MaxPooling2D(pool_size=(2,2)))对卷积层得到的结果进行池化,所使用的窗口大小是2*2像素面积,默认左右移动和上下移动的步长是1,在每个窗口中选出最大的一个像素值作为代表值,因此图片的缩小为原来的4倍;经过池化后,通过model.add(Dropout(0.5))函数对池化得到的结果进行选取一些神经元;
步骤2.3:在步骤2.2中构建了第一层卷积神经网络后,接下来再构建第三层卷积神经网络,继续使用model.add(Conv2D(256,kernel_size=(3,3),strides=(1,1),
padding='same',activation='relu'))函数构建第三层卷积神经网络的卷积层,256表示使用256个卷积核,每个图片都与256个卷积核进行计算,得到256个结果,kernel_size=(3,3)表示每个卷积核的大小为3*3,strides=(1,1)表示每个卷积核左右移动和上下移动的步长是1个像素,padding='same'表示经过卷积层后,输入图片的大小和输出图片的大小一致,通过零补充来保证输出图片和输入图片的大小一致,activation='relu'表示将卷积计算的结果通过激活函数relu来激活,通过激活函数relu让计算量减少并且不会出现梯度消失的情况;经过卷积层后,还有池化层和使用DropOut函数进行处理,通过model.add(MaxPooling2D(pool_size=(2,2)))函数进行池化,池化的窗口大小是2*2,默认的移动步长是1*1,即左右移动和上下移动的步长是1个像素,每次移动窗口选出其中最大的一个像素点作为代表值,池化前后的图片大小缩小了4倍;最后执行DropOut函数,以概率0.5保留每个神经元。
2.根据权利要求1所述的一种基于Keras框架和深度神经网络的图片分类方法,其特征在于,将手写数字图像数据集划分为训练集、测试集,然后对其进行维度修改,并对标签数据进行one-hot编码的具体过程为:
对数据集进行预处理,首先获得数据集,本实验的数据集是一个手写数字数据库,包含训练集和测试集,总共有55000个训练样本,5000个验证样本和10000个测试样本,每个样本是由数字图片和一个真实值组成,图片是黑白的,像素是28*28,数据集需要先从网站中下载,将下载成功的文件放在目录中,再通过函数加载数据集,函数中的path参数是下载数据集的目录地址,该函数返回两个元组,第一个元组是训练集数据和对应的类别号,第二个元组是测试集数据和对应的类别号,训练集和测试集的类别号都是一个数字(0-9);
在上述步骤获得训练集和测试集的真实值数字(0-9),后面的编码需要将真实值数字转换成one-hot编码,通过手写的函数将每个数字转换为由10个0或1组成的序列,图片上数字是在对应的索引上为1,其他为0。
3.根据权利要求1所述的一种基于Keras框架和深度神经网络的图片分类方法,其特征在于,通过Keras框架构建三层全连接层和输出层,设置每层全连接层和输出层的神经元个数包含下列步骤:
步骤3.1:在完成三层卷积神经网络后,接下来需要构建三层全连接层,首先构建第一层全连接层,全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来,由于其全相连的特性,一般全连接层的参数也是最多的,卷积层、池化层和激活函数层操作是将原始数据映射到隐层特征空间,全连接层则将学到的分布式特征表示映射到样本标记空间,通过model.add(Dense(128,activation='relu'))函数创建第一层全连接层,Dense是keras库中的函数,用于创建全连接层,参数128表示该层上的节点数是128,activation='relu'表示将计算得到的结果再通过激活函数relu实现;
步骤3.2:构建完第一层全连接层后,再通过model.add(Dense(64,activation='relu'))函数创建第二层全连接层,64表示该层的神经元个数为64,activation='relu'表示将计算得到的结果再通过激活函数relu;
步骤3.3:构建完第二层全连接层后,通过model.add(Dense(32,activation='relu'))函数构建第三层全连接层,32表示该层的神经元个数是32,activation='relu'表示将计算得到的结果再通过激活函数relu,到止为止,三层的全连接层已全部创建;
步骤3.4:构建完上述的三层全连接层后,接下来就是最后一层,即输出层,因为数字图片识别有10个类别(0-9),每个图片有10个可能性,所以输出层的节点数是10,通过model.add(Dense(10,activation='softmax'))函数创建输出层,参数10表示该输出层有10个神经元,activation='softmax'表示将10个结果转换成10个概率,每个概率对应每个类别的概率,概率最大的表示该图片数字是索引号,softmax函数如式(2)所示:
其中:j表示神经网络的第j层,Zj表示第j层的输出,K表示神经网络的总层数,σ(z)j表示第j层神经网络输出所表示的概率。
4.根据权利要求1所述的一种基于Keras框架和深度神经网络的图片分类方法,其特征在于,调用Keras框架的API构建损失函数,并在训练集上进行训练,得到的模型在测试集上进行测试包含下列步骤:
步骤4.1:完成输出层构建后,接下来就要计算损失大小,通过降低损失来训练好模型,通过model.compile(optimizer='adagrad',loss='categorical_crossentropy',metrics=['accuracy'])函数来计算损失,optimizer='adagrad'表示采用adagrad优化器,loss='categori cal_crossentropy'表示采用多类的对数损失,使用交叉熵损失,metrics=['accuracy']表示评估模型在训练和测试时的性能指标,参数是一个列表,可以使用多个不同的指标来评估模型,这里使用准确率accuracy来评估模型,交叉熵损失函数如式(3)所示:
其中:n表示样本总数,j表示第j个样本,m表示每个样本的类别数,i表示第i个类别,yj表示第j个样本的真实值,Zi表示第j个样本的预测输出;
步骤4.2:定义好损失函数后,就可以使用model对象来训练数据,通过model.fit(X_train,y_train_one,validation_data=(X_test,y_test_one),epochs=20,batch_size=128)来训练数据,X_train,y_train_one分别是训练集和训练集对应的真实值one-hot编码,validation_data=(X_test,y_test_one)是验证集,这里的验证集就是采用测试集,X_test,y_test_one分别是测试集和测试集对应的真实值one-hot编码,epochs=20表示将所有训练集训练20遍,bat ch_size=128表示每次批处理的记录数是128条;
步骤4.3:最后通过scores=model.evaluate(X_test,y_test_ohe,verbose=0)函数测试结果,X_test,y_test_one分别是测试集数据和测试集对应的真实值one-hot编码,verbose=0表示进度方式,训练中控制台不显示数据,该函数返回测试集的准确率。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910529685.1A CN110378383B (zh) | 2019-06-19 | 2019-06-19 | 一种基于Keras框架和深度神经网络的图片分类方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910529685.1A CN110378383B (zh) | 2019-06-19 | 2019-06-19 | 一种基于Keras框架和深度神经网络的图片分类方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110378383A CN110378383A (zh) | 2019-10-25 |
CN110378383B true CN110378383B (zh) | 2023-06-16 |
Family
ID=68248905
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910529685.1A Active CN110378383B (zh) | 2019-06-19 | 2019-06-19 | 一种基于Keras框架和深度神经网络的图片分类方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110378383B (zh) |
Families Citing this family (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111046908A (zh) * | 2019-11-05 | 2020-04-21 | 杭州电子科技大学 | 基于卷积神经网络的乳化炸药包装故障实时监测模型 |
CN110889448A (zh) * | 2019-11-26 | 2020-03-17 | 北京华医共享医疗科技有限公司 | 一种基于卷积神经网络的心电分类方法 |
CN111326167B (zh) * | 2020-03-09 | 2022-05-13 | 广州深声科技有限公司 | 一种基于神经网络的声学特征转换方法 |
CN111428798A (zh) * | 2020-03-30 | 2020-07-17 | 北京工业大学 | 一种基于卷积神经网络的植物幼苗分类方法 |
CN111666435A (zh) * | 2020-06-11 | 2020-09-15 | 南通科技职业学院 | 一种基于深度学习的蓝印花布纹样数据集具体构建方法 |
CN111833310B (zh) * | 2020-06-17 | 2022-05-06 | 桂林理工大学 | 一种基于神经网络架构搜索的表面缺陷分类方法 |
CN111882033B (zh) * | 2020-07-15 | 2024-04-05 | 南京航空航天大学 | 一种基于Keras的区域民航主被动碳排放预测方法 |
CN113011496A (zh) * | 2021-03-19 | 2021-06-22 | 郑州轻工业大学 | 一种基于图模型的服装图像分类方法 |
CN113096796B (zh) * | 2021-04-01 | 2022-09-02 | 四川大学华西医院 | 脑出血血肿扩大风险智能化预测系统及方法 |
CN113361688A (zh) * | 2021-06-04 | 2021-09-07 | 浙江工业大学 | 一种针对乌贼巨型轴突中动作电位的建模方法 |
CN113435513B (zh) * | 2021-06-28 | 2024-06-04 | 平安科技(深圳)有限公司 | 基于深度学习的保险客户分群方法、装置、设备和介质 |
CN113688787A (zh) * | 2021-09-14 | 2021-11-23 | 青岛农业大学 | 花生叶片病害识别方法 |
CN114755002B (zh) * | 2022-04-06 | 2023-05-30 | 燕山大学 | 一种基于全连接神经网络的缓冲平衡阀故障诊断方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106599941A (zh) * | 2016-12-12 | 2017-04-26 | 西安电子科技大学 | 基于卷积神经网络与支持向量机的手写数字识别方法 |
CN109784151A (zh) * | 2018-12-10 | 2019-05-21 | 重庆邮电大学 | 一种基于卷积神经网络的脱机手写汉字识别方法 |
-
2019
- 2019-06-19 CN CN201910529685.1A patent/CN110378383B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN110378383A (zh) | 2019-10-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110378383B (zh) | 一种基于Keras框架和深度神经网络的图片分类方法 | |
US11636337B2 (en) | System and method for knowledge distillation between neural networks | |
Howard et al. | Mobilenets: Efficient convolutional neural networks for mobile vision applications | |
CN112613581B (zh) | 一种图像识别方法、系统、计算机设备和存储介质 | |
Yu et al. | Mixed pooling for convolutional neural networks | |
RU2661750C1 (ru) | Распознавание символов с использованием искусственного интеллекта | |
CN110135267A (zh) | 一种大场景sar图像细微目标检测方法 | |
Barucci et al. | A deep learning approach to ancient egyptian hieroglyphs classification | |
CN112464865A (zh) | 一种基于像素和几何混合特征的人脸表情识别方法 | |
CN117597703B (zh) | 用于图像分析的多尺度变换器 | |
Saha et al. | A Lightning fast approach to classify Bangla Handwritten Characters and Numerals using newly structured Deep Neural Network | |
CN110837570A (zh) | 对图像数据进行无偏见分类的方法 | |
CN113011243A (zh) | 基于胶囊网络的面部表情分析方法 | |
Liu et al. | A novel image retrieval algorithm based on transfer learning and fusion features | |
Li et al. | An improved lightweight network architecture for identifying tobacco leaf maturity based on Deep learning | |
Wu | CNN-Based Recognition of Handwritten Digits in MNIST Database | |
Sarwinda et al. | Automatic multi-class classification of indonesian traditional food using convolutional neural networks | |
CN116704382A (zh) | 一种无人机影像语义分割方法、装置、设备及存储介质 | |
CN114241497B (zh) | 基于上下文关系注意力机制的表格序列识别方法及系统 | |
Wang et al. | An improved deep learning framework brief-net based on convolutional neural networks | |
CN113313127A (zh) | 文本图像识别方法、装置、计算机设备和存储介质 | |
MUNSARIF et al. | An improved convolutional neural networks based on variation types of optimizers for handwritten digit recognition | |
Majumdar et al. | Deep columnar convolutional neural network | |
Xue et al. | Recent research trends on Model Compression and Knowledge Transfer in CNNs | |
Kataraki et al. | Scalable Handwritten Digit Recognition Application using Neural Network and Convolutional Neural Network On Heterogeneous Architecture |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |