对于解决图像降噪的问题,稀疏分解方案已经逐步过时,最新的解决方案在深度学习的神经网络。在神经网络技术飞速演进过程中,卷积神经网络(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》文章,请联系我获取。
网友评论