文章首发于本人CSDN账号:https://blog.csdn.net/tefuirnever
由于微信不允许外部链接,你需要点击页尾左下角的“阅读原文”,才能访问文中的链接。
0、写在前面
讲道理,其实这个文章我是怀着一个很严肃的心情写的,因为一谈到【找工作】这个问题,就很焦虑。。。。。。看到这个省略号了嘛?这就是我的心情 :|,尤其是在就业一年比一年难的情况下。
为什么这么说?
事实上19届秋招算法岗就有些【供过于求】了,头条甚至发了 算法劝退贴。而这很大程度上就是由于前几年算法就业形势太好了,导致一大批人转算法,这导致的大泡沫其实还没有消化掉,所以其实不是现在算法突然不好找工作了,而是之前太容易了。其实你说公司真的不缺算法工程师嘛?当然不是,公司也是有算法工程师的缺口的,那为什么出现这种情况?除了要劝退一部分盲目入行的同学;听到、遇到的好几个HR都说,收到几百份简历,但是没什么匹配的。所以说做算法的人多是真的,可是需要做算法的人也是真的,而主要的矛盾点在于 供需不匹配。
所以在经历过好多次心态崩裂,也问过很多前辈和大佬之后,参考了很多大佬的文章之后,我决定来总结一下如果想成为一个【深度学习算法工程师】需要什么学习能力和知识储备。
1、编程能力
这真是个老生常谈的问题,为什么这么说呢,自然是因为这个【编程能力】我听过不下几百遍,听的脑瓜子都疼,可是没法子,这就是 必备技能,必备到什么程度?
这么说吧,假如你想写作文,如果你不会写字,组词,造句,我想你应该完全没法完成这个创作过程。很形象吧,但是也确实如此,仔细想一想,招你进去是要干活的,公司不会招聘一个只会 MATLAB 或者 python 都用不熟的人来做项目开发吧,做纯算法研究都不行。
那么 具体地说,编程能力需要哪些基本要求呢?
(1)熟练使用 linux
新手肯定都是用 Windows 起手的了,像我之前就是这样,但是在学习过程中发现在 Windows 上搞不定了,一般也会先忍几次,然后掉头就去学 linux 了,一定是这样的过程。哪些在 Windows 上真的搞不定呢?比如:最新论文中提出的视觉开源算法等等。
但是在条件上可能很多人都觉得不是太合适,比如实验室条件,电脑条件等等,不过对我们而言,linux 并不需要了解太深。装个 ubuntu 系统,常用的文件操作、程序编译等知道就OK了。剩下的完全是在使用的过程中现用现学,手边常备一本书 《鸟哥的linux私房菜》,神书,你可以百度或者Google一下自然就知道这个书的强大了。在或者现在的网络比较强大了,资源也是很多,实验楼 也是一个不错的选择,帮你搭配好的环境,直接使用就OK了。如果还是想自己搞一下,虚拟机也是一个不错的选择,不会影响你电脑本来的环境配置,但是还满足了要求。
(2)熟练使用 python
网络如此发达的今天,如果你说你找不到资源我是不相信的,但是如果你说你眼花缭乱了,我是毫不质疑的。因为我当时就就是这样的,基础部分看廖雪峰的python教程就可以了,我个人有看一些,但是真正入门的是一本书——《Python编程:从入门到实践》,极其的基础,但是对小白来说非常友好。
有的同学会问是学 python2 还是 python3?这么说吧,python 核心团队计划2020年停止支持 python2,也就是说 python2 马上就要说再见了,肯定还是学 python3,遇到之前的 python2 的代码再查找区别即可。python 学起来其实很简单,看别人代码的过程就是学习的过程。对于不熟悉的用法多搜下官方文档,如 python,numpy,pandas,matplot,scikit-learn等等。
python 的开发环境值得说一下,因为有太多选择,这里比较建议使用 pycharm 和 jupyter notebook 吧,具体可以参考这个博客——Windows10 下 Anaconda和 PyCharm 的详细的安装教程(图文并茂)。
(3)流畅使用C++
至于 C++,比较普遍的都是 《C++ primer》 或 《C++ primer plus》 这样的大块头书,如果是入门的话应该还可以,倒是不如 《王道程序员求职宝典》 这类书实用。大块头书优点在于全面,同时也往往导致了重点不突出。如果想看视频课程的话,推荐中国慕课上北大的《程序设计与算法》,第1门课程是 C 语言程序设计,第2门课程是算法基础,第3门课程是 C++ 程序设计。看视频课程一般比较慢,如果没什么基础或者特别想把基础学好的话,强烈推荐。
(4)良好的算法基础
其实没做过检测或者分割或者其他的,是很正常的,快速跟进就是了,这是公司开发的常态。但是如果一些网络结构基础,图像的基础概念,卷积神经网络的基础——大话卷积神经网络CNN(干货满满),等等,这样很可能会犯很多低级错误,可能会出现很多问题。
这就要求开发能力必须过关,因为算法效率在实际生产中还是有要求的。工业界用的算法是滞后于学术界好几年的,不要对公司所做的算法有太多的幻想,现实数据比你想的质量差太多,现实用的算法也没有那么高端,大部分时间都不是用在建模。
(5)良好的编程习惯
这里说的习惯有:多使用类,多利用函数封装,写好项目的目录结构,良好的变量或者函数命名,善用程序的注释功能,Python 编程语言需要遵循 PEP8 规范(杂谈——Python代码写得丑怎么办?autopep8来帮你)等等。这可以帮助你更好的和同事或者同行沟通,而且看着也舒服,就算好久不看程序了,依然可以做到很好的回溯记忆。
2、深度学习理论
基于深度学习的计算机视觉是计算机视觉的两大方向之一,另一个是 SLAM,机器学习包括深度学习里的大部分算法本质上都是用来做 分类 的。具体到计算机视觉领域一般就是 物体分类(Object Classification)、目标检测(Object Detection)、语义分割(Image Semantic Segmentation) 等,当然也有一些很酷又好玩的东西比如 edges2cats、deepart 等等。
我主要做一些【图像重建】或者【超分辨率】相关的东西。其实一般是看一看论文,复现复现网络结构,或者直接跑一跑别人的代码,做一做网络结构修改,调一调超参数。前期的图像数据集制作,还有预处理才是主要的工作。深度学习为什么这么强?它比传统的图像处理方法好吗?它主要解决了什么样的问题呢?
个人比较认同是以下三点:学习特征的能力很强,通用性强,开发优化维护成本低。存在的问题可能就是数据量,对 label 的精准性要求比较大。之前看过的一个文章写得不错,参见 为什么深度学习几乎成了计算机视觉研究的标配?。
关于这一部分理论的学习,漫天飞的各种资源。这里推荐一些:
3、g++, CMake和Makefile
python 是脚本语言,而当前大量的 AI 算法都部署在移动端嵌入式平台,需要使用 c / c++ / java 语言,g++,CMake 和 Makefile 正是 Linux 下编译 C系代码 的工具,也是必备的基础。实际上一些python,matlab开源项目也需要预编译,更多的等到了工作岗位自然懂。
4、shell,vim 和 git
Linux 下一个熟练的工程师,会比 Windows 下工作效率高很多,提高写代码效率可以从终端多任务管理,熟练使用 shell 命令,熟练使用 vim 等开发环境,熟练使用 git 命令等地方入手。
5、python 爬虫
深度学习项目开发中最重要的就是 数据!!!或许是一句戏言,但是有一句话是这么说的,深度学习在目前阶段可以认为是一个数据的游戏,你的数据更好,标记的更完美,你的运行结果就更棒。尤其是实际的项目经常没有足够多的数据,这个时候就需要自己去想办法获取了。除了公开的数据集之外,其他的数据怎么获得呢?互联网是一个什么资源都有的大宝库,学会使用好爬虫,你将可能成为时代里最有资源的人,我想叫你金矿工,而且这也很可能是项目成功的开始。
6、数据可视化
处理数据的一个常用的手段就是数据可视化!在深度学习项目中,常需要的数据可视化操作包括原始图片数据的可视化,损失和精度的可视化等。除了对数据可视化,还需要对模型进行可视化,方便调试和感知。
这个方面我的建议是多打一些比赛,多看一看别人的代码和博客,这样就会很容易学会的。
7、数学基础
数学知识真的没必要系统学习,效率低又耗时,毕竟大家都有本科或者研究生的基础了,这就足够了。用的最多的就是矩阵论!!!或者用到的时候学,学完之后总结一下。再就是活学活用网上的搜索资源,比如 CSDN、知乎等等。