对于深度学习的基础,大体分为三个部分:
理论知识基础(数学知识的掌握程度)
编程基础(C/C++/python)
实践基础(配置环境,debug,遇到问题寻找答案)
因为之前大部分的工作是在电赛,主要使用的语言是C。也参加过ACM,使用C++来编写算法。得益于这些实践,自己的C/C++编程功底是有一些的,因此上手python很快,也了解了些python的底层知识(推荐一本)。
Python语言很华丽很美妙很高级。C语言100行做的事情Python可能2行就做到了,但是啊,你不知道Python的2行代码中其实也执行了C语言,如果你使用的是C实现的Python,在Python内核中,实际调用的还是C语言,只是你看不到摸不着罢了。
深度学习的入门门槛虽然,但是稍微努努力,过了这扇门,以后的路就好走多了:一篇文章解决机器学习,深度学习入门疑惑。
大部分编程语言都是共通的,熟练掌握其中一门,其他语言也就好入手了。
编程语言接触的越多就会越明白这个道理,不论是动态语言、静态语言还是解释型语言、编译型语言,大体都是互通的。都有近似统一的数据类型,都有近似统一的流程结构,很多关键字也是一样的,
本科的时候我们第一个学习的编程语言应该是C语言。当时一人一本红皮谭浩强,且不说对这本书的评价,也是起码引领我们步入了编程的大门。实话实话学好C语言受益无穷。到如今,C语言的C99标准还是一如既往地稳定,C语言仍然无处不在。
每种编程语言都有归宿
自从升入研究生以来,写C语言的机会变少了,大部分时间只是在看。面对着自己曾经很熟悉很熟悉的语言,像是陌生了很多,担心自己这样会"忘掉”它,于是想着去用用啊,去随便写点东西啊,强行去操作啊。
但还是发现,C语言不适合我当时的项目,强行往上凑是不行的。就和我曾盲目相信python是世界上最好用的语言一样(2333,不是php)。曾一度以为python什么也可以做,但是忽略了重要的一点,编程语言设计的初衷。
翻了翻C语言的历史。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。主要是用于底层开发的。而Python呢,Python的设计者Guido van Rossum是根据ABC语言开发出来的,而这门语言的初衷是为了服务那些非程序员们。怪不得Python语言长得那么像伪代码。
所以啊,面对不同的项目,挑一门不同的编程语言吧,比如我来说:
Python:主要用来编写深度学习代码,利用Tensorflow和Pytorch库来实现自己的想法,当然Python还可以做别的,也用Python搭建过网站的后台(Django)。
C/C++:自己对C语言更熟悉一些吧,因为C语言很纯粹很干净,没有直接的类功能的支持虽然是硬伤,但是其底层性的特点还是无与伦比的,C语言更多的是在写瓶颈算法代码。而C++对我来说稍微臃肿一些,标准更新太快,不过毕竟和C有亲戚关系,一视同仁了。
Java:又是一门脚本语言,但是在我看来JS也开始面向大工程来发展了,各种标准也是层出不穷,每年一个草案,模块与模块间的互相调用也越来越严谨了。这门我一般拿来在浏览器上玩耍,制作一些自己的小工具之类的。
还有一些语言,还接触过lua和php,亦或是C#,lua是为了快速入门torch,php是为了搭建这个wordpress做后端的博客。C#是为了使用VS做一个WPF上位机。lua小巧强大和C语言很亲近,PHP自己并不是很喜欢,看了纯粹为了WordPress,C#看了有小半年,各方面也挺好用,不过需要充分理解一切皆对象的概念。
人的精力有限,掌握一门编程语言还是很难的。所以很羡慕那些会多国语言的人,既然人家都能学那么好,那么我们怎么就不能掌握多门编程语言呢?
还是多学一些语言吧
很多人说精通一门语言比学会多种语言有用,这句话说得在理,但是我在实际的项目中更多的是多种编程语言齐驱并驾的,一种语言吃到死的项目还是比较少的。
为什么,其实工作中更多遇到的是交叉编译,但凡涉及到项目,光使用一门语言一般是行不通的。大多数都需要结合不同语言的特长来进行。把自己的技能树点满,遇到不同的怪物也就游刃有余了。
在利用Pytorch这个深度学习框架在搭建一些深度学习算法的时候,我们利用python来写核心程序,但是如果遇到瓶颈,一些算法速度要求只用python写满足不了这时候就需要C/C++了。另外学习学习cuda也是必要的。
但有一门语言是必学的。
今天,IEEE Spectrum 发布了第五届顶级编程语言交互排行榜:Python 卫冕成功,C++ 异军突起,雄踞第二,C 语言和 Java 则「退位让贤」,分据第三和第四。
可以这么说,Python不管在求职、开源项目、自定义项目都占据第一的位置可以说很强势了,Python的优势不必多说,学好Python好好搞事才是硬道理。
总结下,建议学习的的语言:C/C++、Python以及JS。
好习惯
我这里要说的好习惯不是指早睡早起,这个睡觉的习惯,我不做过多的评价,每个人有每个人的习惯。而且自己也是反例,平时都是一点多睡,早上8点左右起,这样着实不好,大家别学我。
我要说的,是编写代码过程中,能做的检查尽量都做了,别嫌麻烦,该使用assert就别嫌影响代码美观,注释最好都写上,该有的log就log了,该git就git,要不然到时候调试起来真的很影响效率。
本人深深受了这个的苦啊。
应不应该上博
这个应该是老生常谈的问题了,曾有一老友专门过来劝我读博,彻夜畅谈,当时差点就被打动了…读博这个真的需要考虑清楚,我身边有很多转博的人,无非就是两种:
老师劝直博,答应肯定能毕业,因为专业偏理论,然后自己感觉研究生出来也不知道做什么,索性再读几年。
自己有想法,想搞研究,感觉研究生三年时间不够用,需要博士的时间继续搞。
确实,如果自己想要研究的东西发现一两年根本出不来结果,何不尝试一下博士呢?
因为一旦你工作了,你想要做的,其实和老板让你做的,差距还是挺大的。
上不上博不是自己一个人的事儿,问问家人,问问女朋友,看看他们是否支持你,然后最终当然看自己的选择了。
项目?工作?
如果一直以研究的心态去找工作,去做项目,那么我想说:你想的和人家要的,那可以天壤之差。
之前有一个项目,我想要用Python来写,用GPU来跑,想多了啊,人家要求用C++来写,用CPU来跑,你以为谁都有GPU呢,项目谈的更是实际,实际落位才是硬道理,因为使用你产品的人,不一定都有GPU。
如果一心科研,那么项目将会是一个完全不同的天地,两者差别还是很大的,各有各有长处短处,有人说理论很难,也有人说实际项目很难,这个真的不好说,只有理论和实际相结合,才是最好的吧。
找工作来说,算法领域,C++/C语言仍然是万金油,不能忽视哇。
后记
简单谈谈自己的感受,希望对大家有帮助。
好几天没写博客,发现一个道理:
对于大多数有需求的程序员来说,阅读博客是一件很爽的体验。
尤其是在看满满知识干货的时候,那新鲜的代码和公式啊,赤裸裸地铺满在博主整齐有条理的页面上,那一张张配图是多么地诱人。虽然恨不得赶紧把这些内容扫荡下来,鼠标滚轮上的中指就要按奈不住往下滑——等等!先收藏了。
但是写博客就稍稍麻烦了,想吐槽的知识太多,奈何时间又不够,只能慢慢来啊…总得需要酝酿是吧?
贵在坚持吧~