研究生入学已经半年了,这半年里除了上课就是在自学深度学习相关的东西,乘着寒假在家闲着写点东西。
刚入学的时候因为我们要对一些不同风格的字体进行分类,一开始我用的是Gabor来提取特征,然后用SVM进行分类,虽然实验结果还可以,但是人机交互太多有点不方便,而且运行速度也不够快。因为我平常关注一些机器学习的公众号,看里面经常提起什么卷积神经网络这些概念,一开始也不是很懂,然后我就在网上查了很多资料,决定开始自学神经网络。
首先我看了斯坦福的UFLDL教程,详细地看了一下里面关于BP网络的推导过程,因为数学基础不是很好,看懂推导过程也花了不少时间。光说不练假把式嘛,根据推导出来的结论,我用MATLAB尝试着编了一下程序,这真的是一个艰辛的过程,程序虽然写出来了,但是我一直不确定到底写对没,因为当时刚开始学,也不知道该怎么来证明。后来我想了一下,干脆用之前Gabor提取的字体特征来当数据,输入进去之后,发现损失值并没有减小,用了更小的学习率也还是不行,看来程序肯定哪里写错了。接着我就开始在程序里找错误,因为数据量很大,调试程序根本找不出错误在哪里,一遍一遍的看程序,终于还是找到了错误,代码里面有个小错误,改完以后,损失值果然按照预期减小了,真的是喜闻乐见,都快把我高兴坏了,这个BP网络只是踏出的一小步,不过也算一个小成就吧。
只有一个BP网络当然满足不了我们的需求,太局限了。有一次在网上看到一个公开课的教程,真觉得很受益,就是斯坦福的CS231n,主讲教师是Fei-Fei Li和她的两个学生Andrej Karpathy 和 Justin Johnson(最近还看了Jusin的一篇论文,快速风格转移)。CS231n课程里面从K近邻和cifar10数据集开始给大家讲了如何对数据集进行分类以及怎么提高分类识别率,讲了各种神经网络算法,从基础的梯度下降、梯度优化算法等通俗易懂地讲了神经网络参数优化的过程,后面又详细讲解了卷积神经网络(CNN)里面的各种参数以及实现。这个教程很适合从零基础开始学。
学完CS231n已经有了神经网络的基础知识了,因为我们的目的是要应用。大型的深度神经网络靠自己用梯度下降算法来搭建不太现实,不过有能力的同学可以尝试一下。现成有很多框架能用,如Tensorflow、Caffe、Pytorch等。现在用的最多的还是Tensorflow,这个框架主要是用图的结构来搭建网络,我只学了Tensorflow也不好评价其他的框架,不过我觉得Tensorflow用起来还行,不过也有很多人说不好用。大家如果想学的话可以买本书,不过我还是建议网上的资料看看就行了,我就是看Tensorflow中文社区自学的,那里面讲得真挺好的,可以先根据中文社区里面提供的一个卷积神经网络跑一下,不过最好把这个程序里面每一个细节都搞明白,搞明白后再自己尝试搭建一些大型的网络结构,如AlexNet、VGGNet、GoogLeNet、ResNet等,这些网络如果写不出来也可以参考别人写的,github上搜一下很多,我以前也是写不出来就参考别人怎么写的,然后就模仿别人的编程方法,后来自然而然就会了。
跑深度神经网络也有很多技巧,我自己在做实验的时候感受最深的是:网络中没有Batch Normalization对不同字体识别率大概到93%就是极限了,不管怎么调整网络参数就是上不去,当我加入Batch Normalization后识别率惊人的稳定在了97%。当然除了BN还有很多,比如数据增强、Dropout、提前中断训练、学习率指数衰减等。
今天就先说到这了,之后我再详细谈一下卷积神经网络(CNN)、生成对抗网络(GANs)、风格转移(Style Transfer)、胶囊网络(Capsule)
还有大家如果对深度学习以及神经网络感兴趣的话,希望能够关注我的Github主页,我会把我的代码传上去,大家可以下载下来在自己电脑上跑一下,有些程序还是蛮有意思的:-D
希望大家多多支持。
Github: https://github.com/MingtaoGuo
--------------------- 本文来自 MarTin Guo 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Geoffrey_MT/article/details/79346674?utm_source=copy