深度学习代码与前端代码区别
深度学习的代码能力与开发后台或者前端的工程代码能力不是一个概念。
写前端代码:脑海中是整个工程的架构,写代码则是把这些架构用 code 具体化。
写深度学习代码:脑海中浮现的是整个网络框架,以及网络框架中的流动的gradient,当你可以熟练地在脑中模拟流动的gradient,你就可以实现任何复杂的idea,甚至独立去实现一些现有框架所不包含的结构。
提升深度学习代码能力的方法
1.详细理解每一个深度学习模块的功能,实现细节:
找github上的代码,打印一份纸质版出来,用pycharm这类软件debug模式运行,一行一行跑,每步跑完查看生成的新变量,包括数据类型,具体数值,适当在纸上做做标注和笔记。再结合具体的paper来理解,进步会很快。
2.在1的基础上独立实现一些简单的深度学习框架:
本人从Andrej Karpathy的convnet.js学习了很多;基本可以 from scratch的撸一个可以用的动态图的深度学习框架(当然效率远不如现成大库pyTorch,TensorFlow等)
3.在2的学习过程中或者更好地是快速学习完成之后,开始着手研究自己领域的相关论文,手动实现论文中的算法,并和论文开源代码的最后结果进行比较,以验证自己写得正确。
4.进入正循环阶段,读paper,写code,想idea,写code…
其他
写深度学习的代码第一个感觉就是跟普通的业务代码不一样,普通业务代码写的至少有思路,最多就是麻烦。
但深度学习的代码实在复杂的多,而且比较麻烦。对新手最难理解就是张量,如果之前接触过Matlab的矩阵操作会感到很难理解。但如果接触过python的列表就容易理解了,简单理解就是高维数据的表达方式。在loss函数需要的就是张量的操作,如果单看代码不可能理解究竟做了什么,所以最好就是运行一遍看看结果是什么。
如果看过著名的网络代码,就发现有各种文件,数据,模型,训练,预测,日志,配置,把很多人都搞得蒙了,其实一个完整的模型不需要这么多东西,这么多是为了别人能只修改几个参数就能轻易使用。所以一开始不需要这么复杂,数据集,模型,训练,预测就行了。
当然,起步肯定要看别人写好的代码,熟悉设计思路。只看代码是不够的,如果不想只做一个下代码,调参数的,推荐参加kaggle比赛,也可以看别人的论文,尝试自己复现。复现会比较难,推荐先看写好的代码,然后自己不看只通过记忆复现。