Ⅰ 利用pytorch CNN手写字母识别神经网络模型识别多手写字母(A-Z)
往期的文章,我们分享了手写字母的训练与识别
使用EMNIST数据集训练第一个pytorch CNN手写字母识别神经网络
利用pytorch CNN手写字母识别神经网络模型识别手写字母
哪里的文章,我们只是分享了单个字母的识别,如何进行多个字母的识别,其思路与多数字识别类似,首先对图片进行识别,并进行每个字母闷梁历的轮廓识别,然后进行字母的识别,识别完成后,直接在图片上进行多个字母识别结果的备注
Pytorch利用CNN卷积神经网络进行多数字(0-9)识别
根据上期文章的分享,我们搭建一个手写字母识别的神经网络
第一层,我们输入Eminist的数据集,Eminist的数据图片是一维 28*28的图片,所以第一层的输入(1,28,28),高度为1,设置输出16通道,使用5*5的卷积核对图片进行卷积运算,每步移动一格,为了避免图片尺寸变化,设置pading为2,则经过第一层卷积就输出(16,28,28)数据格式
再经过relu与maxpooling (使用2*2卷积核)数据输出(16,14,14)
第二层卷积层是简化写法nn.Conv2d(16, 32, 5, 1, 2)的第一个参数为输入通道数in_channels=16,其第二个参数是输出通道数out_channels=32, # n_filters(输出通道数),第三个参数为卷积核大小,第四个参数为卷积步数,最后一个为pading,此参数为保证输入输出图片的尺寸大小一致
全连接层,最后使用nn.linear()全连接层进行数据的全连接数据结构(32*7*7,37)以上便是整个卷积神经网络的结构,
大致为:input-卷积-Relu-pooling-卷积
-Relu-pooling-linear-output
卷积神经网络建完后,使用forward()前向传播神经网络进行输入图片的识别
这里我们使用腐蚀,膨胀操作对图片进行一下预处理操作,方便神经网络的识别,当然,我们往期的字母数字渣稿识别也可以添加此预处理操作,方便神经网络进行预测,提高精度
getContours函数主要是进行图片中数字区域的区分,把每个数字的坐标检测出来,这样就可以 把每个字母进行CNN卷积神经网络的识别,进而实现多个字母识别的目的
首先,蚂搜输入一张需要检测的图片,通过preProccessing图片预处理与getContours函数获取图片中的每个字母的轮廓位置
transforms.Compose此函数可以 把输入图片进行pytorch相关的图片操作,包括转换到torch,灰度空间转换,resize,缩放等等操作
然后加载我们前期训练好的模型
由于神经网络识别完成后,反馈给程序的是字母的 UTF-8编码,我们通过查表来找到对应的字母
字符编码表(UTF-8)
通过上面的操作,我们已经识别出了图片中包括的字母轮廓,我们遍历每个字母轮廓,获取单个字母图片数据,这里需要特殊提醒一下 :我们知道EMNIST数据库左右翻转图片后,又进行了图片的逆时针旋转90度
这里我们使用cv2.flip(imgRes,1)函数,进行图片的镜像,并使用getRotationMatrix2D函数与warpAffine函数配合来进行图片的旋转操作,这里就没有PIL来的方便些
然后,我们对图片数据进行torch转换train_transform(imgRes),并传递给神经网络进行识别
待识别完成后,就可以把结果备注在原始图片上
Ⅱ 一文看懂四种基本的神经网络架构
原文链接:
http://blackblog.tech/2018/02/23/Eight-Neural-Network/
更多干货就在我的个人博客 http://blackblog.tech 欢迎关注
刚刚入门神经网络,往往会对众多的神经网络架构感到困惑,神经网络看起来复杂多样,但是这么多架构无非也就是三类,前馈神经网络,循环网络,对称连接网络,本文将介绍四种常见的神经网络,分别是CNN,RNN,DBN,GAN。通过这四种基本的神经网络架构,我们来对神经网络进行一定的了解。
神经网络是机器学习中的一种模型,是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。
一般来说,神经网络的架构可以分为三类:
前馈神经网络:
这是实际应用中最常见的神经网络类型。第一层是输入,最后一层是输出。如果有多个隐藏层,我们称之为“深度”神经网络。他们计算出一系列改变样本相似性的变换。各层神经元的活动是前一层活动的非线性函数。
循环网络:
循环网络在他们的连接图中定向了循环,这意味着你可以按照箭头回到你开始的地方。他们可以有复杂的动态,使其很难训练。他们更具有生物真实性。
循环网络的目的使用来处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。
循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。
对称连接网络:
对称连接网络有点像循环网络,但是单元之间的连接是对称的(它们在两个方向上权重相同)。比起循环网络,对称连接网络更容易分析。这个网络中有更多的限制,因为它们遵守能量函数定律。没有隐藏单元的对称连接网络被称为“Hopfield 网络”。有隐藏单元的对称连接的网络被称为玻尔兹曼机。
其实之前的帖子讲过一些关于感知机的内容,这里再复述一下。
首先还是这张图
这是一个M-P神经元
一个神经元有n个输入,每一个输入对应一个权值w,神经元内会对输入与权重做乘法后求和,求和的结果与偏置做差,最终将结果放入激活函数中,由激活函数给出最后的输出,输出往往是二进制的,0 状态代表抑制,1 状态代表激活。
可以把感知机看作是 n 维实例空间中的超平面决策面,对于超平面一侧的样本,感知器输出 1,对于另一侧的实例输出 0,这个决策超平面方程是 w⋅x=0。 那些可以被某一个超平面分割的正反样例集合称为线性可分(linearly separable)样例集合,它们就可以使用图中的感知机表示。
与、或、非问题都是线性可分的问题,使用一个有两输入的感知机能容易地表示,而异或并不是一个线性可分的问题,所以使用单层感知机是不行的,这时候就要使用多层感知机来解决疑惑问题了。
如果我们要训练一个感知机,应该怎么办呢?
我们会从随机的权值开始,反复地应用这个感知机到每个训练样例,只要它误分类样例就修改感知机的权值。重复这个过程,直到感知机正确分类所有的样例。每一步根据感知机训练法则来修改权值,也就是修改与输入 xi 对应的权 wi,法则如下:
这里 t 是当前训练样例的目标输出,o 是感知机的输出,η 是一个正的常数称为学习速率。学习速率的作用是缓和每一步调整权的程度,它通常被设为一个小的数值(例如 0.1),而且有时会使其随着权调整次数的增加而衰减。
多层感知机,或者说是多层神经网络无非就是在输入层与输出层之间加了多个隐藏层而已,后续的CNN,DBN等神经网络只不过是将重新设计了每一层的类型。感知机可以说是神经网络的基础,后续更为复杂的神经网络都离不开最简单的感知机的模型,
谈到机器学习,我们往往还会跟上一个词语,叫做模式识别,但是真实环境中的模式识别往往会出现各种问题。比如:
图像分割:真实场景中总是掺杂着其它物体。很难判断哪些部分属于同一个对象。对象的某些部分可以隐藏在其他对象的后面。
物体光照:像素的强度被光照强烈影响。
图像变形:物体可以以各种非仿射方式变形。例如,手写也可以有一个大的圆圈或只是一个尖头。
情景支持:物体所属类别通常由它们的使用方式来定义。例如,椅子是为了让人们坐在上面而设计的,因此它们具有各种各样的物理形状。
卷积神经网络与普通神经网络的区别在于,卷积神经网络包含了一个由卷积层和子采样层构成的特征抽取器。在卷积神经网络的卷积层中,一个神经元只与部分邻层神经元连接。在CNN的一个卷积层中,通常包含若干个特征平面(featureMap),每个特征平面由一些矩形排列的的神经元组成,同一特征平面的神经元共享权值,这里共享的权值就是卷积核。卷积核一般以随机小数矩阵的形式初始化,在网络的训练过程中卷积核将学习得到合理的权值。共享权值(卷积核)带来的直接好处是减少网络各层之间的连接,同时又降低了过拟合的风险。子采样也叫做池化(pooling),通常有均值子采样(mean pooling)和最大值子采样(max pooling)两种形式。子采样可以看作一种特殊的卷积过程。卷积和子采样大大简化了模型复杂度,减少了模型的参数。
卷积神经网络由三部分构成。第一部分是输入层。第二部分由n个卷积层和池化层的组合组成。第三部分由一个全连结的多层感知机分类器构成。
这里举AlexNet为例:
·输入:224×224大小的图片,3通道
·第一层卷积:11×11大小的卷积核96个,每个GPU上48个。
·第一层max-pooling:2×2的核。
·第二层卷积:5×5卷积核256个,每个GPU上128个。
·第二层max-pooling:2×2的核。
·第三层卷积:与上一层是全连接,3*3的卷积核384个。分到两个GPU上个192个。
·第四层卷积:3×3的卷积核384个,两个GPU各192个。该层与上一层连接没有经过pooling层。
·第五层卷积:3×3的卷积核256个,两个GPU上个128个。
·第五层max-pooling:2×2的核。
·第一层全连接:4096维,将第五层max-pooling的输出连接成为一个一维向量,作为该层的输入。
·第二层全连接:4096维
·Softmax层:输出为1000,输出的每一维都是图片属于该类别的概率。
卷积神经网络在模式识别领域有着重要应用,当然这里只是对卷积神经网络做了最简单的讲解,卷积神经网络中仍然有很多知识,比如局部感受野,权值共享,多卷积核等内容,后续有机会再进行讲解。
传统的神经网络对于很多问题难以处理,比如你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNN能够对任何长度的序列数据进行处理。
这是一个简单的RNN的结构,可以看到隐藏层自己是可以跟自己进行连接的。
那么RNN为什么隐藏层能够看到上一刻的隐藏层的输出呢,其实我们把这个网络展开来开就很清晰了。
从上面的公式我们可以看出,循环层和全连接层的区别就是循环层多了一个权重矩阵 W。
如果反复把式2带入到式1,我们将得到:
在讲DBN之前,我们需要对DBN的基本组成单位有一定的了解,那就是RBM,受限玻尔兹曼机。
首先什么是玻尔兹曼机?
[图片上传失败...(image-d36b31-1519636788074)]
如图所示为一个玻尔兹曼机,其蓝色节点为隐层,白色节点为输入层。
玻尔兹曼机和递归神经网络相比,区别体现在以下几点:
1、递归神经网络本质是学习一个函数,因此有输入和输出层的概念,而玻尔兹曼机的用处在于学习一组数据的“内在表示”,因此其没有输出层的概念。
2、递归神经网络各节点链接为有向环,而玻尔兹曼机各节点连接成无向完全图。
而受限玻尔兹曼机是什么呢?
最简单的来说就是加入了限制,这个限制就是将完全图变成了二分图。即由一个显层和一个隐层构成,显层与隐层的神经元之间为双向全连接。
h表示隐藏层,v表示显层
在RBM中,任意两个相连的神经元之间有一个权值w表示其连接强度,每个神经元自身有一个偏置系数b(对显层神经元)和c(对隐层神经元)来表示其自身权重。
具体的公式推导在这里就不展示了
DBN是一个概率生成模型,与传统的判别模型的神经网络相对,生成模型是建立一个观察数据和标签之间的联合分布,对P(Observation|Label)和 P(Label|Observation)都做了评估,而判别模型仅仅而已评估了后者,也就是P(Label|Observation)。
DBN由多个限制玻尔兹曼机(Restricted Boltzmann Machines)层组成,一个典型的神经网络类型如图所示。这些网络被“限制”为一个可视层和一个隐层,层间存在连接,但层内的单元间不存在连接。隐层单元被训练去捕捉在可视层表现出来的高阶数据的相关性。
生成对抗网络其实在之前的帖子中做过讲解,这里在说明一下。
生成对抗网络的目标在于生成,我们传统的网络结构往往都是判别模型,即判断一个样本的真实性。而生成模型能够根据所提供的样本生成类似的新样本,注意这些样本是由计算机学习而来的。
GAN一般由两个网络组成,生成模型网络,判别模型网络。
生成模型 G 捕捉样本数据的分布,用服从某一分布(均匀分布,高斯分布等)的噪声 z 生成一个类似真实训练数据的样本,追求效果是越像真实样本越好;判别模型 D 是一个二分类器,估计一个样本来自于训练数据(而非生成数据)的概率,如果样本来自于真实的训练数据,D 输出大概率,否则,D 输出小概率。
举个例子:生成网络 G 好比假币制造团伙,专门制造假币,判别网络 D 好比警察,专门检测使用的货币是真币还是假币,G 的目标是想方设法生成和真币一样的货币,使得 D 判别不出来,D 的目标是想方设法检测出来 G 生成的假币。
传统的判别网络:
生成对抗网络:
下面展示一个cDCGAN的例子(前面帖子中写过的)
生成网络
判别网络
最终结果,使用MNIST作为初始样本,通过学习后生成的数字,可以看到学习的效果还是不错的。
本文非常简单的介绍了四种神经网络的架构,CNN,RNN,DBN,GAN。当然也仅仅是简单的介绍,并没有深层次讲解其内涵。这四种神经网络的架构十分常见,应用也十分广泛。当然关于神经网络的知识,不可能几篇帖子就讲解完,这里知识讲解一些基础知识,帮助大家快速入(zhuang)门(bi)。后面的帖子将对深度自动编码器,Hopfield 网络长短期记忆网络(LSTM)进行讲解。
Ⅲ cnn鏈夊摢鍑犵
CNN鏈夊摢鍑犵
CNN鏄鎸囧嵎绉绁炵粡缃戠粶(Convolutional Neural Network)锛屾槸浜哄伐鏅鸿兘棰嗗煙涓涓涓閲嶈佺殑绠楁硶銆傚畠宸茬粡琚搴旂敤浜庡悇绉嶉嗗煙锛屼緥濡傝$畻鏈鸿嗚夈佽闊宠瘑鍒鍜岃嚜鐒惰瑷澶勭悊绛夈傞偅涔堬紝CNN鏈夊摢鍑犵嶅憿锛熸湰鏂囧皢涓烘偍璇︾粏浠嬬粛銆
1. 甯歌勭殑鍗风Н绁炵粡缃戠粶
甯歌勭殑鍗风Н绁炵粡缃戠粶鏄鎸囩敱鑻ュ共涓鍗风Н灞傘佹睜鍖栧眰鍜屽叏杩炴帴灞傜粍鎴愮殑缃戠粶銆傚嵎绉灞備富瑕佹槸鐢ㄦ潵鎻愬彇鍥惧儚鐨勭壒寰侊紝姹犲寲灞傜敤鏉ラ檷浣庣壒寰佸浘鐨勫ぇ灏忥紝鑰屽叏杩炴帴灞傚垯鐢ㄦ潵瀵圭壒寰佽繘琛屽垎绫汇傚父瑙勭殑鍗风Н绁炵粡缃戠粶鍙浠ュ簲鐢ㄤ簬鍚勭嶉嗗煙锛屼緥濡傚浘鍍忓垎绫汇佺洰鏍囨娴嬪拰鍥惧儚鍒嗗壊绛夈
2. 娈嬪樊缃戠粶
娈嬪樊缃戠粶(Resial Neural Network)鏄鐢卞井杞鐮旂┒闄㈢殑Kaiming He绛変汉鎻愬嚭鐨勩傚畠鐨勪富瑕佹濇兂鏄寮曞叆鈥滄畫宸鍧椻濓紝閫氳繃璁╃綉缁滅殑杈撳嚭涓庤緭鍏ヤ箣闂村缓绔嬬洿鎺ョ殑鏄犲皠鍏崇郴锛岃В鍐充簡鍦ㄤ竴浜涙繁灞傜綉缁滀腑鍑虹幇鐨勬搴︽秷澶遍棶棰樸傛畫宸缃戠粶鍙浠ユ瀬澶у湴鎻愬崌娣卞害绁炵粡缃戠粶鐨勫噯纭搴︼紝骞朵笖宸茬粡鍦ㄥ悇绉嶅簲鐢ㄤ腑琚骞挎硾浣跨敤銆
3. 鍗风Н绁炵粡缃戠粶鐨勫彲瑙i噴鎬ф柟娉
鍗风Н绁炵粡缃戠粶鐨勫彲瑙i噴鎬т竴鐩存槸鐮旂┒鐨勭儹鐐逛箣涓銆傚湪寰堝氬疄闄呭簲鐢ㄤ腑锛屼汉浠闇瑕佺煡閬撶綉缁滄槸濡備綍鍋氬嚭鍐崇瓥鐨勶紝浠ヤ究鏇村ソ鍦扮悊瑙e拰瑙i噴缁撴灉銆傜洰鍓嶄富瑕佹湁涓ょ嶅彲瑙i噴鎬ф柟娉曪細涓绉嶆槸鍩轰簬姊搴︾殑鏂规硶锛屼緥濡侴rad-CAM锛涘彟涓绉嶆槸鍩轰簬缃戠粶鍐呴儴鐗瑰緛鐨勬柟娉曪紝渚嬪侫ctivation Atlas銆傝繖浜涙柟娉曞凡缁忚骞挎硾搴旂敤浜庤$畻鏈鸿嗚夈佸尰瀛﹀浘鍍忓勭悊绛夐嗗煙銆
4. 鍗风Н绁炵粡缃戠粶鍦ㄧ洰鏍囨娴嬩腑鐨勫簲鐢
鍗风Н绁炵粡缃戠粶鍦ㄧ洰鏍囨娴嬩腑鐨勫簲鐢ㄦ槸鍏朵竴涓閲嶈佺殑鐮旂┒棰嗗煙銆傜洰鏍囨娴嬫槸璁$畻鏈鸿嗚変腑鐨勪竴涓閲嶈侀棶棰橈紝鍏朵富瑕佷换鍔℃槸鍦ㄥ浘鍍忎腑瀹氫綅鍜岃瘑鍒鐗╀綋銆傜洰鍓嶏紝甯哥敤鐨勭洰鏍囨娴嬫柟娉曚富瑕佹湁涓ょ嶏細鍩轰簬鍖哄煙鐨勬柟娉曞拰鍩轰簬妗嗘灦鐨勬柟娉曘傝繎骞存潵锛屾繁搴﹀︿範鎶鏈鐨勫彂灞曚娇寰楀熀浜庢嗘灦鐨勬柟娉曞湪鐩鏍囨娴嬩腑寰楀埌浜嗗箍娉涚殑搴旂敤锛屼緥濡傚熀浜庡嵎绉绁炵粡缃戠粶鐨勭洰鏍囨娴嬫柟娉昚OLO鍜孎aster R-CNN绛夈
5. 鍗风Н绁炵粡缃戠粶鍦ㄨ嚜鐒惰瑷澶勭悊涓鐨勫簲鐢
闄や簡鍦ㄨ$畻鏈鸿嗚夐嗗煙锛屽嵎绉绁炵粡缃戠粶杩樿骞挎硾搴旂敤浜庤嚜鐒惰瑷澶勭悊銆傚嵎绉绁炵粡缃戠粶鍙浠ラ氳繃瀵规枃鏈杩涜屽嵎绉鎿嶄綔鏉ユ彁鍙栨枃鏈鐨勫眬閮ㄧ壒寰侊紝骞朵笖鍙浠ラ氳繃姹犲寲灞傛潵闄嶇淮銆傚嵎绉绁炵粡缃戠粶鍦ㄦ儏鎰熷垎绫汇佹枃鏈鍒嗙被鍜屾満鍣ㄧ炕璇戠瓑浠诲姟涓宸茬粡寰楀埌浜嗗箍娉涚殑搴旂敤銆
6. 鎬荤粨
缁间笂鎵杩帮紝鍗风Н绁炵粡缃戠粶鏄浜哄伐鏅鸿兘棰嗗煙涓涓涓閲嶈佺殑绠楁硶锛屽畠宸茬粡琚骞挎硾搴旂敤浜庡悇绉嶉嗗煙銆傞櫎浜嗗父瑙勭殑鍗风Н绁炵粡缃戠粶涔嬪栵紝杩樻湁娈嬪樊缃戠粶銆佸嵎绉绁炵粡缃戠粶鐨勫彲瑙i噴鎬ф柟娉曠瓑銆傚湪璁$畻鏈鸿嗚夐嗗煙锛屽嵎绉绁炵粡缃戠粶琚骞挎硾搴旂敤浜庣洰鏍囨娴嬶紱鑰屽湪鑷鐒惰瑷澶勭悊涓锛屽嵎绉绁炵粡缃戠粶鐨勫簲鐢ㄤ篃瓒婃潵瓒婂彈鍒板叧娉ㄣ