您的位置:首页 > 理论基础 > 计算机网络

深度学习 13. 能力提升, 一步一步的介绍如何自己构建网络和训练,利用MatConvNet(二),思路整理

2017-04-07 14:50 781 查看
本文为原创文章转载必须注明本文出处以及附上 本文地址超链接  以及 博主博客地址:http://blog.csdn.NET/qq_20259459  和 作者邮箱(
jinweizhi93@gmai.com )。

(如果喜欢本文,欢迎大家关注我的博客或者动手点个赞,有需要可以邮件联系我)

上一篇文章因为中间加入了许多的代码块,可能影响大家的阅读,思路不清晰。所以我今天更新一篇来主要说清楚我们的思路。

准备工作:

首先我们需要让一切实验相关的文件尽可能的有规律的整理好。例如每一次实验的结果,每一次我们修改的变数,每一次我们修改的Input data等等。 以我个人的习惯是建立一个总的文件夹可以命名为MatConvNet。在下面另有:result,data,remember等。

这是一个好习惯的养成,在深度学习中我们最最注重的就是调参,因此每一次的改变我们都需要有完整的记录。而好习惯自然会帮你得到更好的结果。

正文:

前言


这里我就不介绍操作的过程了,关于Code的解释我的博客中有好几篇文章的解释(http://blog.csdn.net/qq_20259459)。希望大家好好阅读,理解相关函数的意思,如果不理解函数就像急于训练就会导致事倍功半。

第二,我上一篇文章:(http://blog.csdn.net/qq_20259459/article/details/65633407)写的非常的详细,希望大家可以用心去读一下,然后再看本文。
如果code和上一篇大家都读完了,那么这一篇文章将会是一篇很好的整理和提升的文章。


整体思路:

我们训练的过程中用到的无非就三个大的步骤:得到数据,训练,结果分析。


数据:

1.得到好的且可以训练的数据是很重要的,许多时候不能收敛的情况都是坏的或者错误的数据处理操作导致的。因为我们大部分用的是现有的数据库,所以我们在下载数据库之后需要了解清楚数据库的构成,比如Cifar-10和-100的数据库就是条状的,需要进行相关的处理。这个我们前面也说过。

2.数据的分成一般来说是train data =70% validation data =15% test data =15%. 
3.数据输入正确以后,我们需要进行相关的normalization的处理。(这部非常的重要)
4.正则化处理结束之后,我们就可以将相关的data,label, class,class name都放入imdb结构体中,imdb我在前一篇说过了,这才是训练的本体结构。


训练:

1.如果我们确认input的数据是对的,那么我们可以开始我们的训练了。

2.构建训练的网络。网络的构建或者是网络中某一层的创建都是现在深度学习论文的大热,好的网络结构的提出也是论文的大热。所以我们需要不断的训练,不断的改参数,才能自己找到更好的网络结构。在之前的文章中我一直都是用的是LeNet的网络结构和vgg的网络结构。因为这些都是最基础的网络构型,其他的比如NIN这种后代网络都是衍生体。所以我还是会使用LeNet的网络结构来介绍。如果大家有兴趣的话可以阅读相关的paper。

3. 我们知道最最常用的网络单元有:Convolution, ReLu, Pooling(max,average), Dropout., Fully connection, Softmax.
4. 对于LeNet中,我们习惯用C-R-P的block。而在vgg中提出了小的filter组合提升性能的想法:C-R-C-R-P的block。
5.Dropout一般来说我们使用在FC层之前的,不过在最新的论文中也有人提出将D层用在前面的网络中减轻参数。这里我还是提倡大家不要轻易多增加D层,只要在FC前添加即可,rate一般为0.5
6. FC和S层没有什么好说的,不过在之前GoogleNet的网络中已经去除了FC,从而大大的降低了参数。不过这里GN只是一个特列我们不要轻易模仿。
7.我个人最最提倡的还是vgg的构型,我个人的训练中vgg的构型还是效果非常好的。
8.整个网络我们为的就是得到有效的features。
9. FC层的input的大小需为1*1,因此我这里建议正方形的数据库,个人尝试过长方形,可以通过改变filter最终得到1*1的FC的input。但是效果非常不好,我也不能一定说长方形不好,但是还是再次强调大家的数据库的大小最好是为正方形。(这也是目前大家所默认的)


10. 为了得到FC的input是1*1的大小,我们就需要巧妙的用C层和P层来减小原始输入数据的大小。这里的两个公式是需要大家记好的:

关于图片缩小的计算公式:

(1)Conv.layer:   [(N-F)/stride]+1   这里N是input的size,F是filter的size。
(2)如果data的size过小,而希望增加C层来进行深度的网络构造,那么我们就需要用到padding。 公式:padding size = (F-stride)/2 这里F是filter的size。这样我们的C层就不会减小图片,从而进行构造深度网络。
(3)MaxPooling: output = [(N-F)/stride]+1 这里N是input的size,F是filter的size。 但是一般来说我们使用 F=2,S=2的结构,也就是缩小一半。这里的意思就是我们取每一个2*2的区域内最大值(feature最为突出的值)组成新的feature
maps。


结果分析:

结果分析和参数调整我会在下一篇文章为大家介绍。因为这个很重要需要单独拿一篇文章来说明。

本文为原创文章转载必须注明本文出处以及附上 本文地址超链接  以及 博主博客地址:http://blog.csdn.NET/qq_20259459  和 作者邮箱(
jinweizhi93@gmai.com )。

(如果喜欢本文,欢迎大家关注我的博客或者动手点个赞,有需要可以邮件联系我)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐