相关网站:
https://learnopengl-cn.readthedocs.io/zh/latest/ (LearnOpenGL CN)
或者 https://learnopengl-cn.github.io/ (LearnOpenGL CN)
补充性的学习网站:https://learnopengl.com/Introduction (LearnOpenGL-Instruction)
http://www.opengl-tutorial.org/beginners-tutorials/tutorial-1-opening-a-window/(OpenGL 教程)
该网站 Learn OpenGL CN,对OpenGL的基本概念,详细知识点都有着详尽的归纳。并且也有比较好的例子。
相关书籍: 《3D游戏与计算机图形学中的数学方法》
《3D数学基础:图形与游戏开发》
《Unity Shader入门摘要》
相关网站:
https://thebookofshaders.com/07/?lan=ch (The Book of shader:Shapes)
https://www.shadertoy.com/ (ShaderToy)
http://ogldev.atspace.co.uk/ (OpenGL循序渐进—OpenGL开发)
(1)、计划仔细研读5,6遍https://learnopengl-cn.readthedocs.io/zh/latest/ (LearnOpenGL CN)。对OpenGL的基本知识有比较好的掌握。
(2)、看相关书籍: 《3D游戏与计算机图形学中的数学方法》
《3D数学基础:图形与游戏开发》
《Unity Shader入门摘要》
(3)、对OpenGL知识点有较好的掌握之后,写一篇OpenGL的学习报告总结或者PPT报告。
(4)、学习OpenGL的具体的实践小案例,对OpenGL的实践知识有所了解。
(5)、将所学到的OpenGL知识运用到实际的项目领域中,达到知识和实践的融会贯通,做到知行结合。
官方网站:
https://docs.opencv.org/3.4.0/d5/de7/tutorial_dnn_googlenet.html (OpenCV的开源计算机视觉)
网站:
https://github.com/ex2tron/OpenCV-Python-Tutorial (或http://codec.wang/opencv-python )
网站:https://github.com/spmallick/learnopencv
通过该网站,可以学习到齐全的OpenCV案例代码。这些案例代码中存在有很多有参考价值的代码片段与学习案例,认真学习会有很大的收益。
(1)、整体来说,OpenCV的学习资料比较少。重点还是要精读 OpenCV的官方网站的文档,对OpenCV的基础知识有个很好的掌握。
(2)、学习书籍:OpenCV编程入门和学习OpenCV3
(3)、学习OpenCV-Python图像处理教程,并且对 OpenCV:c++和python案例有所涉猎。
由于OpenCV的学习资料比较少,后期有更好的学习资料和相关网站,后续再逐步补充。
(1)、基础数学(高等数学,线性代数,概率论等)
使用教材:《机器学习的数学》 ------ 孙博著
考研数学教材 补充
(2)、机器学习
使用教材:数学导向-----李航的《统计学习方法》,
技术导向------周志华的《机器学习》(西瓜书) -----哔哩哔哩的视频
(3)、机器学习实战
使用教材:《机器学习实战》 ------Peter Harrington著,
《机器学习算法背后的理论和优化》 -------史春奇著
(4)、深度学习
《深度学习的数学》 ------涌井良幸 涌井贞美著
《Python深度学习》 ------弗朗索瓦。肖莱著
《TensorFlow 实战Google深度学习框架》 ------郑泽宇、梁博文等著
《自己动手写神经网络》 -------葛一鸣著
《深度学习》(蓝皮书) -------伊恩.古德费洛著
《动手学习深度学习》 -------阿斯顿·张,李沐等
(1)、http://www.tensorfly.cn/ (TensorFlow中文社区),
该网站google官方的、TensorFlow学习网站。
(2)、https://luweikxy.gitbooks.io/machine-learning-notes/content/content/SUMMARY.html
(该网站是一个非常非常棒的学习网站,对深度学习的数学知识、机器学习知识、深度学习知识等等个个方面都有详尽的归纳。同时该网站也给出了数学基础的学习路径、机器学习的学习路径、深度学习的学习路径。一定要好好利用该学习网站)
(1)、认真的多遍研读上面的提供第二个学习网站,对深度学习的数学基础、深度学习的必要语言和具体工具、机器学习的基本概念、深度学习的基本概念等方面达到一定程度的理解和掌握(期间也会看相关的书籍);
(2)、认真研读购买的数学基础书籍、机器学习书籍、深度学习书籍(期间多看TensorFlow中文社区网站(辅助资料:《TensorFlow 实战Google深度学习框架》),对相关的机器学习、深度学习的基础概念有个更深的理解,并且有一些实践经验;
(3)、真正进入实实在在的项目之中,将所学的机器学习和深度学习知识运用于真正的实践之中,达到知识和实践的融会贯通,做到“实践出真知”的程度。
计算机视觉(深度学习)
附录一:
深度学习的学习路径规划:
微积分:求导,梯度,偏微分,积分等。
统计学,概率论:重点要了解推断统计学和概率论的基本概念。高斯分布,贝叶斯公式。最小二乘法,线性回归,逻辑回归等。我看的主要是 Mendenhall 编写的 Statistics for Engineering and the Sciences ,中文版叫 《统计学》。知识体系比较完整,层次清楚,讲解到位。
线性代数:重点了解基本概念:向量,向量空间,向量投影,矩阵运算,特征值分解,SVD分解等。MIT 有个 35 集的线性代数公开课,对线性代数的讲解及其透彻。网易公开课有视频。我主要从这个课程学习线性代数。没发现太好的书籍。
以 Andrew NG 在 courera 2012 年 11 讲 Machine Learning 为入门途径,内容包括:线性回归,逻辑回归,人工神经网络,BP 算法,优化方法,泛化方法。这些都是机器学习最基本的知识,也是学习深度学习更复杂的算法和问题分析的基础。
以 Andrew Ng 在斯坦福公开课 2008 年 20 讲 Machine Learning 为补充,了解更多的传统机器学习算法或者各种算法背后更多的数学原理。网易公开课有带有中文字幕的视频。
ANN 方面,我主要看的 Simon Haykin 2011年出版的《神经网络与机器学习》。在原理推导方面比较有系统性。
学习 Hinton 在 coursera 2012 年的 16 讲 Neural Networks for Machine Learning 。感知机,反向传播算法,优化,循环网络,泛化,Hopfiled网络,波尔茨曼机,受限玻尔兹曼机(RBM),堆叠RBM,深度置信网络等。
如上文提到的 Henjio 2016 年出版的 Deep Learning Book
以及网上各种学习资源
如 deeplerning4java, Therno, Tensor flow 等,通过实践和积累经验进行学习。这些工具都有指南文档,对机器学习方法和算法也有不同程度的描述。
附录二:
深度学习的学习路径规划:
如果你能够顺畅地读懂深度学习论文中的数学公式,可以独立地推导新方法,则表明你已经具备了必要的数学基础。
掌握数学分析、线性代数、概率论和凸优化四门数学课程包含的数学知识,熟知机器学习的基本理论和方法,是入门深度学习技术的前提。因为无论是理解深度网络中各个层的运算和梯度推导,还是进行问题的形式化或是推导损失函数,都离不开扎实的数学与机器学习基础。
数学分析:在工科专业所开设的高等数学课程中,主要学习的内容为微积分。对于一般的深度学习研究和应用来说,需要重点温习函数与极限、导数(特别是复合函数求导)、微分、积分、幂级数展开、微分方程等基础知识。在深度学习的优化过程中,求解函数的一阶导数是最为基础的工作。当提到微分中值定理、Taylor公式和拉格朗日乘子的时候,你不应该只是感到与它们似曾相识。这里推荐同济大学第五版的《高等数学》教材。
线性代数:深度学习中的运算常常被表示成向量和矩阵运算。线性代数正是这样一门以向量和矩阵作为研究对象的数学分支。需要重点温习的包括向量、线性空间、线性方程组、矩阵、矩阵运算及其性质、向量微积分。当提到Jacobian矩阵和Hessian矩阵的时候,你需要知道确切的数学形式;当给出一个矩阵形式的损失函数时,你可以很轻松的求解梯度。这里推荐同济大学第六版的《线性代数》教材。
概率论:概率论是研究随机现象数量规律的数学分支,随机变量在深度学习中有很多应用,无论是随机梯度下降、参数初始化方法(如Xavier),还是Dropout正则化算法,都离不开概率论的理论支撑。除了掌握随机现象的基本概念(如随机试验、样本空间、概率、条件概率等)、随机变量及其分布之外,还需要对大数定律及中心极限定理、参数估计、假设检验等内容有所了解,进一步还可以深入学习一点随机过程、马尔可夫随机链的内容。这里推荐浙江大学版的《概率论与数理统计》。
凸优化:结合以上三门基础的数学课程,凸优化可以说是一门应用课程。但对于深度学习而言,由于常用的深度学习优化方法往往只利用了一阶的梯度信息进行随机梯度下降,因而从业者事实上并不需要多少“高深”的凸优化知识。理解凸集、凸函数、凸优化的基本概念,掌握对偶问题的一般概念,掌握常见的无约束优化方法如梯度下降方法、随机梯度下降方法、Newton方法,了解一点等式约束优化和不等式约束优化方法,即可满足理解深度学习中优化方法的理论要求。这里推荐一本教材,Stephen Boyd的《Convex Optimization》。
机器学习:归根结底,深度学习只是机器学习方法的一种,而统计机器学习则是机器学习领域事实上的方法论。以监督学习为例,需要你掌握线性模型的回归与分类、支持向量机与核方法、随机森林方法等具有代表性的机器学习技术,并了解模型选择与模型推理、模型正则化技术、模型集成、Bootstrap方法、概率图模型等。深入一步的话,还需要了解半监督学习、无监督学习和强化学习等专门技术。这里推荐一本经典教材《The elements of Statistical Learning》。
深度学习要在实战中论英雄,因此具备GPU服务器的硬件选型知识,熟练操作Linux系统和进行Shell编程,熟悉C++和Python语言,是成长为深度学习实战高手的必备条件。当前有一种提法叫“全栈深度学习工程师”,这也反映出了深度学习对于从业者实战能力的要求程度:既需要具备较强的数学与机器学习理论基础,又需要精通计算机编程与必要的体系结构知识。
编程语言:在深度学习中,使用最多的两门编程语言分别是C++和Python。迄今为止,C++语言依旧是实现高性能系统的首选,目前使用最广泛的几个深度学习框架,包括Tensorflow、Caffe、MXNet,其底层均无一例外地使用C++编写。而上层的脚本语言一般为Python,用于数据预处理、定义网络模型、执行训练过程、数据可视化等。当前,也有Lua、R、Scala、Julia等语言的扩展包出现于MXNet社区,呈现百花齐放的趋势。这里推荐两本教材,一本是《C++ Primer第五版》,另外一本是《Python核心编程第二版》。
Linux操作系统:深度学习系统通常运行在开源的Linux系统上,目前深度学习社区较为常用的Linux发行版主要是Ubuntu。对于Linux操作系统,主要需要掌握的是Linux文件系统、基本命令行操作和Shell编程,同时还需熟练掌握一种文本编辑器,比如VIM。基本操作务必要做到熟练,当需要批量替换一个文件中的某个字符串,或者在两台机器之间用SCP命令拷贝文件时,你不需要急急忙忙去打开搜索引擎。这里推荐一本工具书《鸟哥的Linux私房菜》。
CUDA编程:深度学习离不开GPU并行计算,而CUDA是一个很重要的工具。CUDA开发套件是NVidia提供的一套GPU编程套件,实践当中应用的比较多的是CUDA-BLAS库。这里推荐NVidia的官方在线文档http://docs.nvidia.com/cuda/。
其他计算机基础知识:掌握深度学习技术不能只满足于使用Python调用几个主流深度学习框架,从源码着手去理解深度学习算法的底层实现是进阶的必由之路。这个时候,掌握数据结构与算法(尤其是图算法)知识、分布式计算(理解常用的分布式计算模型),和必要的GPU和服务器的硬件知识(比如当我说起CPU的PCI-E通道数和GPU之间的数据交换瓶颈时,你能心领神会),你一定能如虎添翼。
接下来分别从理论和实践两个角度来介绍一下深度学习的入门。
深度学习理论入门:我们可以用一张图(图1)来回顾深度学习中的关键理论和方法。从MCP神经元模型开始,首先需要掌握卷积层、Pooling层等基础结构单元,Sigmoid等激活函数,Softmax等损失函数,以及感知机、MLP等经典网络结构。接下来,掌握网络训练方法,包括BP、Mini-batch SGD和LR Policy。最后还需要了解深度网络训练中的两个至关重要的理论问题:梯度消失和梯度溢出。
深度学习高手怎样炼成?拿下阿里天池大赛冠军的中科院博士为你规划了一份专业成长路径
以卷积神经网络为例,我们用图2来展示入门需要掌握的知识。起点是Hubel和Wiesel的对猫的视觉皮层的研究,再到日本学者福岛邦彦神经认知机模型(已经出现了卷积结构),但是第一个CNN模型诞生于1989年,1998年诞生了后来被大家熟知的LeNet。随着ReLU和Dropout的提出,以及GPU和大数据所带来的历史机遇,CNN在2012年迎来了历史性的突破——诞生了AlexNet网络结构。2012年之后,CNN的演化路径可以总结为四条:1. 更深的网络;2. 增强卷积模的功能以及上诉两种思路的融合ResNet和各种变种;3. 从分类到检测,最新的进展为ICCV 2017的Best Paper Mask R-CNN;4. 增加新的功能模块。
深度学习高手怎样炼成?拿下阿里天池大赛冠军的中科院博士为你规划了一份专业成长路径
深度学习实践入门:掌握一个开源深度学习框架的使用,并进一步的研读代码,是实际掌握深度学习技术的必经之路。当前使用最为广泛的深度学习框架包括Tensorflow、Caffe、MXNet和PyTorch等。框架的学习没有捷径,按照官网的文档step by step配置及操作,参与GitHub社区的讨论,遇到不能解答的问题及时Google是快速实践入门的好方法。
初步掌握框架之后,进一步的提升需要依靠于具体的研究问题,一个短平快的策略是先刷所在领域权威的Benchmark。例如人脸识别领域的LFW和MegaFace,图像识别领域与物体检测领域的ImageNet、Microsoft COCO,图像分割领域的Pascal VOC等。通过复现或改进别人的方法,亲手操练数据的准备、模型的训练以及调参,能在所在领域的Benchmark上达到当前最好的结果,实践入门的环节就算初步完成了。
后续的进阶,就需要在实战中不断地去探索和提升了。例如:熟练的处理大规模的训练数据,精通精度和速度的平衡,掌握调参技巧、快速复现或改进他人的工作,能够实现新的方法等等。
在这里,分享四个方面的深度学习实战经验。
1. 充足的数据。大量且有标注的数据,依旧在本质上主宰着深度学习模型的精度,每一个深度学习从业者都需要认识到数据极端重要。获取数据的方式主要有三种:开放数据(以学术界开放为主,如ImageNet和LFW)、第三方数据公司的付费数据和结合自身业务产生的数据。
2. 熟练的编程实现能力。深度学习算法的实现离不开熟练的编程能力,熟练使用Python进行编程是基础。如果进一步的修改底层实现或增加新的算法,则可能需要修改底层代码,此时熟练的C++编程能力就变得不可或缺。一个明显的现象是,曾经只需要掌握Matlab就可以笑傲江湖的计算机视觉研究者,如今也纷纷需要开始补课学习Python和C++了。
3. 充裕的GPU资源。深度学习的模型训练依赖于充裕的GPU资源,通过多机多卡的模型并行,可以有效的提高模型收敛速度,从而更快的完成算法验证和调参。一个专业从事深度学习的公司或实验室,拥有数十块到数百块的GPU资源已经是普遍现象。
4. 创新的方法。以深度学习领域权威的ImageNet竞赛为例,从2012年深度学习技术在竞赛中夺魁到最后一届2017竞赛,方法创新始终是深度学习进步的核心动力。如果只是满足于多增加一点数据,把网络加深或调几个SGD的参数,是难以做出真正一流的成果的。