转载请注明出处: http://xiahouzuoxin.github.io/notes/html/深度卷积网络CNN与图像语义分割.html
级别1:DL快速上手
级别2:从Caffe着手实践
级别3:读paper,网络Train起来
级别4:Demo跑起来
读一些源码玩玩
熟悉Caffe接口,写Demo这是硬功夫
分析各层Layer输出特征
级别5:何不自己搭个CNN玩玩
Train CNN时关于数据集的一些注意事项
级别6:加速吧,GPU编程
关于语义分割的一些其它工作
说好的要笔耕不缀,这开始一边实习一边找工作,还摊上了自己的一点私事困扰,这几个月的东西都没来得及总结一下。这就来记录一下关于CNN、Caffe、Image Sematic Segmentation相关的工作,由于公司技术保密的问题,很多东西没办法和大家详说只能抱歉了。在5月份前,我也是一个DL和CNN的门外汉,自己试着看tutorials、papers、搭Caffe平台、测试CNN Net,现在至少也能改改Caffe源码(Add/Modify Layer)、基于Caffe写个Demo。这里希望把学习的过程分享给那些在门口徘徊的朋友。没法事无巨细,但希望能起到提点的作用!“乍可刺你眼,不可隐我脚”。
级别1:DL快速上手
UFLDL: http://deeplearning.stanford.edu/tutorial/
这是stanford Ng老师的教材,也刚好是以CNN为主,Ng老师教材的特色就是简洁明白。一遍看不懂多看两遍,直到烂熟于心,顺便把里面的Matlab Exercises完成了。
http://deeplearning.net/tutorial/
PRML作者给的python入门DL的tutorial,基于Theano Framework,有些偏向于RNN的东西。
一句简单的话描述:“深度学习就是多层的神经网络”。神经网络几十年前就有了,而且证明了“2层(1个隐层)的神经网络可以逼近任意的非线性映射”,意思就是说,只要我的参数能训练好,2层神经网络就能完成任意的分类问题(分类问题就是将不同类通过非线性映射划分到不同的子空间)。但2层神经网络存在的问题是:
如果要逼近非常非常复杂的非线性映射,网络的权值W就会很多,造成Train时候容易出现的问题就是Overfitting。所以大事化小,将复杂问题进行分割,用多层网络来逼近负责的非线性映射,这样每层的参数就少了。自然而然的网络就从2层变成了多层,浅网络(shallow)就变成了深网络(deep)。
但科研界的大牛们会这么傻吗,十几年前会想不到用多层网络来进行非线性映射?看看CNN最早的工作:http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf 那是98年的,Train了一个5层的CNN来进行MINIST数据集的数字图片分类。多层神经网络一直不火我觉得有这么两个原因:
神经网络中非线性的映射的极值优化问题本身是一个非凸问题,本身数学理论上的就对非凸优化问题缺少严格有效最优化方法的支撑。直到现在也依然对各层Layer的输出解释不清不楚,但效果就是好,这还得归功于各种大神藏之捏之的各种Tricks
数据与计算能力的问题。十来年前哪来随随便便就这么大的硬盘,哪里去找像ImageNet这样1000类的数据集。“大数据是燃料,GPU是引擎”,正是因为大数据的出现和GPU编程的出现带动了DL的进展,这些在10年前是做不来的。我在CPU与GPU上跑自己简化的Googlenet,GPU比CPU快10倍。
DL只是一个概念而已。对于做图像和视觉的就该一头扎到CNN(Convolutional Neural Netwok),做自然语言的就该投入到RNN(Recurrent Neural Network)。我是做图像的。CNN的学习资料除了上面Ng的tutorial外,还有一个Stanford Li Fei-Fei教授的课程cs231:Convolutional Neural Networks for Visual Recognition,http://cs231n.github.io/convolutional-networks/ 是Notes中一份关于CNN非常详细的资料。
级别2:从Caffe着手实践
先看看这个热个身:贾扬清:希望Caffe成为深度学习领域的Hadoop,增加点学习的欲望,毕竟现在多少人靠着Hadoop那玩意儿挣着大钱。
接着请认准Caffe官方文档: http://caffe.berkeleyvision.org/ 和Github源码: https://github.com/BVLC/caffe 。毫不犹豫fork一份到自己的Github。然后就是照着INSTALL来Complie和Config Caffe了,值得注意的是,安装OpenCV的时候推荐使用源码安装。
先自己熟悉Caffe的架构,主要参考资料就是官网文档,我自己刚开始的时候也写了个小的ppt笔记:Diving into Caffe.pptx
还有两份不错的Caffe tutorials:
Standford CS231课程的Caffe tutorial
Oxford的Caffe tutorial
接着就是要自己动手,实打实地分析一个CNN,比如LeNet、AlexNet,自己在纸上画一画,像下面那样