学什么
这篇学习笔记对应 Udacity 无人驾驶工程师课程的 5-8 课,在这四课组成的第一个项目里,主要教学了神经网络的基础知识。使用的例子是「交通标识识别」。
深入神经网络
无人驾驶技术在近几年的快速崛起很大程度上得益于神经网络的快速发展。这一章节的跨度实在是非常大,从 BP 神经网络的入门到卷积神经网络,又到神经网络的一些细节问题,例如 one-hot 编码与 softmax 函数,再到 tensorflow 框架的基础使用。自底向上的学习路径使得知识掌握非常扎实,但紧凑的课程也让很多学员有点接受不能。而对于已经熟悉神经网络的学员来说,里面的一些例题需要一些枯燥的计算,还挺打断学习的节奏的。
关于神经网络的入门,如果觉得第五章太过简单跳过,影响到后面的学习的话,我这里推荐一个我很喜欢的 Youtuber 3Blue1Brown 的 Neural Networks 课程 Youtube Bilibili 官方汉化。学习这部分内容还需要有一定线性代数知识,你可以在 Udacity 的无人驾驶的入门课程中学习到,3Blue1Brown 也有一套可视化做得很棒的线性代数课程 Youtube Bilibili。如果你很熟悉这两块内容,那么第五章内容就可以很快跳过。
卷积神经网络在图像识别领域已经可以说是非常常用的技术了,作为最简单的例子,你可以看卷积网络之父 Yann Lecun 的网站。Lecun 先生 1988 年在贝尔实验室工作室,为了实现手写识别,引入了卷积神经网络模型。LeNet-5 的模型虽然称之为卷积神经网络,但其实结构极其简单,非常适合作为入门的例子。
至于 softmax 和 one-hot 编码,如果有用过 Matlab 之类做过研究的同学应该很熟悉了,一言以蔽之就是:
, for j = 1, …, K.
对这个函数的感性理解就是,我们把每个分类都给出一个 0-1 之间的概率,softmax 能约束每个分类的概率都在 (0, 1) 之间,且所有项和为 1,是解决分类问题的常见手段。
至于 tensorflow 库的具体使用,我建议直接看 Google TensorFlow 的 Tutorials。Google 家的东西众所周知都是让 Google 自己用得爽的东西,API 有的时候不是特别稳定,而 Udacity 课程的篇幅有限,也不能很具体的解释细节。
项目设计
回到解决这个识别交通标识的问题上,项目提供了一些 pickle 文件作为训练集、测试集和验证集,这里有一个小坑:
pickle
库在 Python 中保证其向后兼容和跨平台兼容,但在实际使用中有遇到过 pickle
在 Windows 操作系统上严重的问题。虽然我不用 Windows,但是对所有其它学员做个提醒好了。
我的预处理方式和网络非常粗暴,毕竟图像识别在今天的神经网络研究中已经不算什么新鲜事了。我使用 OpenCV 简单对图片都进行了降采样,然后降低了对比度,每次训练时做一次随机打散。然后对 LeNet-5 进行了一些简单的优化就基本满足课程项目的要求了。
不过有两个事情我没有尝试过,如果其它学员有多时间的话可以试一试。一个是使用 AutoKeras 这样的项目,通过神经网络自动架构搜索 (ENAS),理论上可以一键建出我们需要的分类网络。另外一个是,我怀疑如果我们使用非常深的网络像是 DenseNet,由于训练集只有 100MB,个人认为会很容易产生过拟合,所以也没有太冒进。如果有同学试一下有结果的话可以发在评论里哦~
不过虽然我说着容易,对于第一次接触 TensorFlow 的同学来说,要想把那么多东西一次消化调通还是一个挺难的事情。我个人认为这个项目对于刚开始接触神经网络框架的来说有一点偏难,个人建议如果在第六课后加一个比较正式的 Project,而不是一个简单的 Quiz,先能跑通整个工作流,再来做具体的图像识别会更容易一些。
另外,Udacity 虽然含有一个 GPU 实例的 Workspace,一方面 Workspace 服务在国内不是很稳定。另一方面是,一共只有 50 小时,而且不停需要手动开关。如果有条件的话,我建议还是本地找个能简单跑 CUDA 显卡的机器吧。像是这次的如果只是 LeNet-5 的话,CPU 也够跑了,但对于之后的课程,可能会有更复杂更依赖 GPU 的课程内容出现,大家也要提前做好准备。
工商时间
如果你也想报名 Udacity 的课程可以从 这里 报名,购买任何课程(除小程序开发)使用 delton0416 作为优惠码可以获得 300 元的折扣。