深度学习笔记[1]: CNN for CV斯坦福CS231n (1)

LEARN FROM THE BEST!

最好的老师、最好的同学、最好的教材 — 我所理解的学习捷径


对刚刚接触Deep Learning的同学,从繁杂的教程中“沙里淘金”并非易事。

这个深度学习笔记系列,会陆续推荐几个优秀的课程给有兴趣涉足Machine Learning尤其是Deep Learning的同学。

我也会随意写一些听课心得,以及自学中遇到挑战。一方面给自己做备忘笔记,另一方面,也希望能和大家一起交流共勉。

吴恩达教授的Machine Learning和Deep Learning前3个课程(还有2个没发布)@coursera讲解清晰,非常适合入门;但是博主一路学下来,感觉似乎太容易拿到100%。其实同样精彩更有挑战性的课程还有呢!

开始第一站!
Stanford CS231n: Convolutional Neural Networks for Visual Recognition

课程简介

Stanford CS231n 课程主页

该课程由Stanford AI Lab贡献,大概是目前全球最好的CNN(for Computer Vison)入门课程。虽说是introduction course,但是毕竟面向的是Stanford学生,还是有足够挑战性的。

建议大家一定去浏览并bookmark CS231n 课程主页。原因如下:

  • 这里有官方第一手的资料链接:课程notes、授课大纲、项目汇报。
  • 这里你能看到Stanford学生的学习标准. 比如Grading Policy, 要想PASS,
    独立完成三次Assignents, 尽可能完成质量对等的midterm/final project

至于课程视频吗,推荐看这里的youtube视频专辑(可加速/减速播放):

CS231n winter 2016

不能上youtube的话,还有百度网盘、网易云课堂,相信难不倒大家。

为什么选 2016版本,而不是最新的2017版?
除了因为2016有李飞飞的一课,还有一个因素,且看下文。

Andrej Karpathy

这里给大家隆重介绍一下Andrej, 他目前是director of AI at Tesla. 李飞飞的得意门生.
啥?李飞飞是谁?你很快就会知道了。
大家先别看光环哈,Andrej的光环不是最大的;但是此君堪称身体力行“知行合一”、“开源共享”精神的典范。他的blog和twitter相当有信息量! 他基本上实现了自己的开源框架,还做过一个academic search tools: arxiv-sanity. 我们身边有才华的人很多,愿意花时间精力跟你分享他们才华的少见。另外,Andrej讲话的速度和风格跟博主很合拍,看他视频,不用加速:) 你会发现这一系列blog follow的是2016 wintor Andrej版本的CS231n,而不是最新的2017 Justin版。(2017版视频可以做巩固提高用嘛,2017版习题正好可做test set)

总之,博主已被Andrej圈粉。
这里有Andrej的学术贡献和博士论文
Connecting Images and Natural Language, Andrej Karpathy, PhD Thesis, 2016。

墙的问题

没有google/youtube/coursera/quora/stackov的日子,想想都觉得蛋疼。
博主本想少花钱,工具用了一把,时间浪费一堆,效果也不好。
而且墙的进化速度是很快的。。。。。。。。。。。。。。。。。。
不说了,我爱中国,说出来都是泪。总之大家各显神通,至少能稳定上google!

实在不好?请不要放弃,国内的知识开源力量也在快速增长。
百度cs231n,也一定能找到课程视频。另外,yahoo也不错。

防民之口,甚于防川。川壅而溃,伤人必多。— 中国古代经验

预备知识

语言

语言是基本功,当然越扎实越好。但语言的精通需要大量积累,非一日之功。

Python
简洁优雅,易学易用。请看下面quick sort代码(By Justin Johnson)

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]   
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)

print(quicksort([3,6,8,10,1,2,1]))
# Prints "[1, 1, 2, 3, 6, 8, 10]"

上面代码就8行,却很清晰!看了心里就一个字,

建议大家在coding实践中多查python/numpy等documentation,做到每一行代码都心中有数。

这样可以在学习本课程的过程,逐渐加强对numpy, matplotlib等常用的库的熟悉度。

对没有任何基础的同学,cs231n 授课老师之一Justin Johnson有一个精华浓缩版的python/numpy教程,可以在做assigments前先练练手。

C++ (本课程一些底层的库会用到)
坊间评价:掌握C只需一本K&R,全面掌握C++嘛……
好在我们不用全面学习C++, 重在掌握需要用到的C++ Subset

想感受C++和Python的区别? 写一个C++版本的generic quick sort试试呗。写完不妨多打几个corner cases,看看能搞出几个bug,一笑。(对C++高手自然小菜一碟)

毕业后博主C++很少用(玩了5年SystemVerilog/UVM,有人听过吗…),但是用gdb debug别人C++ object code的痛苦经历却有一大堆。就不给大家瞎扯了。没有贬低C++的意思哈,其实博主学OOP都是从C++开始的,算是初恋。C++ STL就做的很舒服嘛。建议coding时候有疑问多查看online C++ Reference。

机器学习

强烈推荐Andrew NG(吴恩达)的cousera课程Machine Learning

吴恩达教授的课程真的做到“深入浅出”,而且特别亲民。我怀疑计算机、电子、数学、自动化等理工科专业的同学都能容易的理解吴恩达的授课。并且这个课程assignment用的是matlab/octave通用算法语言,coding很easy,评分系统也很完善。以后有机会博主跟大家分享一下。

数学

对学过高等数学或数学分析的同学,本课程的要求真是相当低的,

高等数学:常见函数求导,链式法则等。
线性代数:向量內积、矩阵乘法,线性空间概念等。
概率统计:概率基础,高斯分布,均值方差等。

博主遥想当年大一大二时,真正是带着虔诚之心学数学。十年后再相逢,有种他乡遇故知的感觉。要培养一些脱离功利主义的兴趣,在浮躁的时代,是奢侈的。

另一方面,要知道眼前推动深度学习大爆炸的不是theory推导, 更多是intuition和experiment(当然还有BigData软硬件计算设施提升)。个人感觉,对一线工程师,数学不好并不可怕,眼高手低才危险。

学习方法

授课的大牛们,能够把复杂的东西用简单的形式展示给大家,如果你足够聪明又有良好的背景知识,“听明白”其实很快。但这只是学习的开始。以我个人的经验:

学习策略 学习效果 不足之处
只看教学视频 30% 纸上谈兵;容易忘记
进一步完成习题和项目 60% 仍不能将知识很好迁移应用
进一步拓展实践(kaggle等) 90% 时间资源开销,注意性价比
? 100%

学习是个迭代过程,多动手practice真的非常重要。在学习CS231n的过程中,下面这个流程会多次重复出现。

Created with Raphaël 2.1.0 开始某算法学习 听课、笔记、查资料 写Code解题 进入下一算法学习 yes no

但是solve problem是个无止境的过程,大家自己掌握好这个度吧。博主学全新ML/DL课程时候,动手练习的时间,至少达到听课时间的1-2倍。

Honor Code

最后,我想说中国是礼仪之邦。我们既然免费学习了Stanford的课程,自然心存感激;更不能做出侵犯别人版权,扰乱别人教学秩序的事情。

可惜不少人在大学里并没有受到严格学术行为规范的熏陶,习惯性的把别人贡献据为己有,不加引用。下面分享Stanford CS major Homework相关的Honor code给大家,希望大家耐心读一读,并严格遵守。

Rule 1: You must not look at solutions or program code that are not your own.

Rule 2: You must not share your solution code with other students.

Rule 3: You must indicate on your submission any assistance you received.

“Discuss ideas together, but do the coding on your own.”

Honor code 完整版

你可能感兴趣的:(深度学习笔记,深度学习,cnn,机器学习,cs231n)