美文网首页
玩转卷积神经网络—MatConvNet和mnist(附资料)

玩转卷积神经网络—MatConvNet和mnist(附资料)

作者: 科技州与数据州 | 来源:发表于2020-11-21 19:28 被阅读0次

    对于解决图像降噪的问题,稀疏分解方案已经逐步过时,最新的解决方案在深度学习的神经网络。在神经网络技术飞速演进过程中,卷积神经网络(CNN)以其优秀的训练效率、较快的训练速度和精准的识别能力,成为了研究的热点。

    01 选择Matlab

    实现CNN有很多成熟方案,主流方案包括了采用Python的Tensorflow框架,用Matlab的MatConvNet包等等。

    在老老实实学习了一段时间CNN晦涩的原理,以及眼花缭乱的网络架构后,心里还是一点没有底。

    古人云:“光说不练假把式,只练不打无用功”。

    接下来还得真正跑一下CNN程序,自己玩转代码才算真正能玩CNN。

    最开始选择的是Python,因为这是开源阵营中处理数据的第一选择啊。而且对于搞数据分析的我,对Python语法也比较熟悉的。但在尝试运行大神论文《Beyond a Gaussian Denoiser_Residual Learning of Deep CNN for Image Denoising》的Python源码过程中泪奔了。

    首先是运行库的煎熬。为了让程序在Tensorflow下跑起来,要进行N多尝试来找到合适的Tensorflow版本,中间还要安装各种依赖包,整个过程就是一场噩梦。

    好容易装完了所有的包,然后又遇到了第二道坎——运行效率低。开始摆弄了许久GPU运行程序,以失败告终,那就用CPU跑吧。参数调得很低:就跑一个迭代,一次就训练10张图片,结果运算一次要半小时。眼泪又开始打转了。

    还有一道坎是调试程序。由于大神的程序读起来费劲,光看结果不能领悟精髓啊,这就需要debug看看过程结果来猜测意图。可是Spyder也不给力,调试反应迟钝,按急了还陷入假死状态。彻底崩溃了。

    最后我果断投入Matlab的怀抱。虽然它不是开源,但是相比Python减少很多麻烦。具体的安装过程见上篇文章:《玩转卷积神经网络-DnCNN体验之旅》。

    02 学习MatConvNet

    既然是要搞CNN实战,拿到MatConvNet这个武器后啥都不说了,先把武器说明书搞懂吧。

    MatConvNet的代码非常的优雅,主要有四大结构,通过一张结构图来梳理一下思路。

    03 学习mnist

    《Beyond a Gaussian Denoiser_Residual Learning of Deep CNN for Image Denoising》大神的源码很复杂,训练过程就更复杂。看了程序运行的过程结果,对一些网络结构比如cnn, relu等原理还是心存疑惑。我决心再多跑一些其它程序来练练级。

    网上翻来翻去,发现各路神仙写的CNN程序都是天马行空,心想还是从熟悉的地方开始,于是回到了MatConvNet的范例程序。其中mnist算是比较简单的,这是一个识别手写数字图片的程序。就先从这开始吧。先奉上mnist的结构图:

    整个程序涉及到两个部分。一是在example这个文件夹里面的前三个文件,运行程序是cnn_mnist_experiments,实现了CNN网络的训练。第四个程序cnn_mnist_test是自己写的,用于测试神经网络识别图片的准确率。二是在example文件夹外面还有cnn_train,vl_simplenn等程序,这些都是供调用的函数,用于实现神经网络训练的方法。

    为了搞懂mnist,首先要把程序中每一段代码含义过一遍,这个大家可以找百度。然后就是跑cnn_mnist_experiments,结果是这样的:

    还有自己编一个测试程序来看看模型的准确率,比如从训练集的70000张图片随便选10000张,再用最后的模型net-epoch-20.mat来识别图片,准确率达到了97.12%,还是很厉害了。

    mnist使用的是经典的LeNet网络。整个训练过程的网络结构为8层:卷积层C1-池化层P1-卷积层C2-池化层P2-卷积层C3-ReLu层-全连接FC层-softmax层。网络结构就像这样:

    作者还给出了一种新方案,在第1,4,7层插入BN(批量归一化)层,整个训练过程的网络结构为11层:卷积层C1-BN层B1-池化层P1-卷积层C2-BN层B2-池化层P2-卷积层C3- BN层B3--ReLu层-全连接FC层-softmax层。BN的作用简单说可以让程序提高学习率、加快训练速度,更加健壮。加了BN之后效果确实要好一些。

    为了体验训练过程,我通过debug看到了网络结构每一层的训练结果:

    第0层 原始图片,图片像这样:

    ,尺寸28*28

    第1层 conv,图片像这样:

    ,尺寸24*24

    第2层 bnorm,图片像这样:

    ,尺寸24*24

    第3层 pool,图片像这样:

    ,尺寸12*12

    ……

    第6层 pool,图片像这样:

    尺寸4*4

    第7层 conv,图片看不见了,尺寸1*1

    后面都是1*1,看不见图片了。

    从训练过程的图像来看,就是一个逐步抽样、细化特征的过程。

    04 下一步计划

    作为最火的AI技术基础,深度学习有着广阔的应用前景,神经网络将持续成为未来的研究方向。

    经过近一段时间对CNN的折腾,感觉有点入门了,下一步我计划:

    一是深入体会网络结构设计的原理,为自己设计网络结构做准备。

    二是加入其它数据源再来运行程序,看过程结果,在实践中体会网络结构中各层的作用。

    三是修改网络结构,自己设计网络结构,体会各层网络参数的原理,做到不仅要知其然,还要知其所以然。争取做出创新。

    四是学习更多的案例,比如cifar,imagenet等。

    如果喜欢请点赞,如想获取大神文章《Beyond a Gaussian Denoiser_Residual Learning of Deep CNN for Image Denoising》文章,请联系我获取。

    相关文章

      网友评论

          本文标题:玩转卷积神经网络—MatConvNet和mnist(附资料)

          本文链接:https://www.haomeiwen.com/subject/vyveiktx.html