斯坦福CS231N课程学习笔记(一).课程简介与准备
前言
开这个系列是因为工作中必须用到计算机视觉相关常识。几经淘洗,发现了斯坦福大学的CS231N课程。为了强行自己学习,强化学习效果,将学习中的笔记整理起来,与你们一起分享,也期望以此与同在学习这门课程、以及其它计算机视觉的学习者、研究者一起探讨跟进步。
本人此前没有接触过这一领域,IT从业以来多以项目为主,少有接触学术跟算法研究,所以学习笔记也会由于本人理解能力原因,存在悖论,恳请阅读者指正。
请注意:本系列是以CS231N为蓝本进行学习的学习笔记,并不是对CS231N的翻译。在学习过程中不可避免地会对于个人知识制度特征补充学习相关内容。关于CS231N的课程翻译,可以参见知乎网友@杜客 的翻译。
CS231N课程简介
CS231N课程的全称是卷积神经网络在视觉识别中的应用(Convolutional Neural Networks for Visual Recognition),是一个学习时长跨度为两个月的课程。这门课程从2015年起第一次开设,授课者是李飞飞,Andrej Karpathy,Justin Johnson。李飞飞,斯坦福大学计算机科学系副教授,入选2015年“全球百大思想者”,现为斯坦福人工智能实验室(SAIL)主任。斯坦福大学在机器学习和计算机视觉上都十分牛。著名的人工智能专家, Google Brain之父吴恩达也是斯坦福大学副教授。
计算机视觉在搜索,图像理解,地图,医疗,无人机和无人驾驶汽车等方面的应用越来越重要和广泛。这些任务的核心就是视觉识别,即图像分类,本地化(localization)和测试。而神经网络(即深度学习)在这一领域的应用既大大提高的视觉识别系统的最新水平。这门课程将以上述任务,特别是图像分类为探究对象,以端到端的方式解读深度学习架构在视觉识别领域的推动。
这门课程将教会学生能否实现、训练跟调试他们自己的神经网络,并获取对计算机视觉这一前沿科学深入认识。在课程最后,你将练习一个有几百万参数的神经网络并将其应用于全球最大的图像分类数据库--ImageNet. 具体而言,课程重点将会是图像辨识问题的设置,学习算法(即后向传播),神经网络训练跟调优中的项目科技问题跟步骤,以及怎样上手完成布置的作业及最后的课业项目(final course project)。
学习这门课程必须对python很熟练,以及对C/C++有High-level的熟悉程度。作业主要使用python(以及python的库如numpy等),但一些关于深度学习的库,也或许使用C/C++。需要有一些学校微积分知识及线性方程知识,需要能看懂求导及矩阵运算。也必须一些基础的几率知识,如高斯分布,均值,标准差之类。这门课程还将讲述代价函数,求导和使用梯度减少法进行改进等,如果学习过CS229(机器学习),这些知识将直接可用。
课程资源
课程的主页在这里。在主页上使用一段JS向来访者显示一个正在进行的图像分类任务。这段javascript,被称之为ConvNetJS,由课程讲授者Andrej Karpathy贡献,在上面的学习中会专门提及。
课程的大纲和课程表见此处。这个课程表可以供自己学习时成为进度参考,同时,这个而面也列出了课程中使用的资源的链接地址。这些资源包含培训用的课件,工具使用手册及一些课程笔记。这些课程笔记非常详尽,对于不能现场听课的人来讲,非常重要。这里是课程笔记的一个例子。
这些课件也可以在google的云盘中获得。如果你应帮其他人上课,这些课件倒是很好的资源,如果仅用于自己学习,建议多从它的课程笔记开始,或者从本笔记开始。
这里有一份讲课的视频播放清单,是 youtube 的。如果能够访问youtube,也可以访问百度云盘。
Andrej Karpathy的博客及课程教职员的twitter也值得关注,提供了最新的一些资讯。另外,你也可以访问Reddit.
课程准备 编程和课程实践工具
CS231N课程作业主要使用python。使用python 2.7版本就可以完成这种作业。安装完python之后,检查一下是否安装了numpy、scipy、Pillow和matplotlib:
bogon:~ aaron$ pip list |grep numpy
numpy (1.8.0rc1)
bogon:~ aaron$ pip list |grep scipy
scipy (0.17.1)
bogon:~ aaron$ pip list |grep matplot
matplotlib (1.3.1)
bogon:~aaron$ pip list |grep Pillow
Pillow (3.2.0)
这里有一个trick,如果你要使用 scipy.misc.imread等图像文件操作变量(正如本文例子中所示),那么实际上需要导入Pillow。但是 scipy安装文件并没有把这个依赖写进来,所以即使你的平台中没有安装Pillow,在执行以下的语句时会错误:
from scipy.misc import imread, imsave, imresize
错误是:
>>> from scipy.misc import imread
Traceback (most recent call last):
File "", line 1, in
ImportError: cannot import name imread
如果没有安装,使用以下的命令安装:
pip install numpy
pip install scipy
pip install matplotlib
pip install Pillow
如何使用scipy全家桶
SciPy提供用于科学计算的核心库。在我们的研究中,比较常见的有图像操作:
from scipy.misc import imread, imsave, imresize
# Read an JPEG image into a numpy array
img = imread('assets/cat.jpg')
print img.dtype, img.shape # Prints "uint8 (400, 248, 3)"
# We can tint the image by scaling each of the color channels
# by a different scalar constant. The image has shape (400, 248, 3);
# we multiply it by the array [1, 0.95, 0.9] of shape (3,);
# numpy broadcasting means that this leaves the red channel unchanged,
# and multiplies the green and blue channels by 0.95 and 0.9
# respectively.
img_tinted = img * [1, 0.95, 0.9]
# Resize the tinted image to be 300 by 300 pixels.
img_tinted = imresize(img_tinted, (300, 300))
# Write the tinted image back to disk
imsave('assets/cat_tinted.jpg', img_tinted)
可以先花一点时间过一下它的quick start tutorial,对numpy的基本用法有个大概知道。当你需要完成某个任务,不知道numpy是否支持时,可以查看它的参考文档。如果你明确了解某个步骤,需要详细知道其确切用法讲课课件笔记格式,可以查看按字母排序索引的索引表。
当然也可以使用python的终极帮助大法,通过全局变量dir()来查看一个对象(或者类)提供的属性和技巧,然后借助 全局变量help() 来查看其用法。
在numpy中,最重要的数据类别是趋同多维下标ndarray。它支持创建矩阵、reshape,copy等操作。linalg是numpy中处理线性代数运算的包,比如对矩阵进行转置,求逆, 点乘,求迹,求特征值和特征向量等。numpy还有用于傅立叶变换的库numpy.fft,与随机数、概率相关的库numpy.random。
matplotlib的主要工作是提供绘图操作:
import numpy as np
import matplotlib.pyplot as plt
# Compute the x and y coordinates for points on sine and cosine curves
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
# Plot the points using matplotlib
plt.plot(x, y_sin)
plt.plot(x, y_cos)
plt.xlabel('x axis label')
plt.ylabel('y axis label')
plt.title('Sine and Cosine')
plt.legend(['Sine', 'Cosine'])
plt.show()
安装IPython notebook
课程简介里看到了安装IPython notebook。CS231N的课程作业使用这个软件来布置。他们的作业布置方式是下发一些后缀为ipnb的文件,通过在IPython notebook中加载某些文件,你能够受到完成这种作业所需要的skeleton代码跟作业指导,如下例所示:
可以发现上面有具体的指示,告诉你需要完成的代码是推动一个K=5的KNN分类器,并且代码实现的位置终于选定,你必须做的就是在选定的位置填写上代码。这上面要求的一些skeleton的代码,已经事先写好了,比如第二课要用到的load_CIFAR10等。
从这种地方可以看出,这门课程的设计是如此精心,不由得让人抱怨一下国内的高校和世界一流大学的差别,其实不仅仅是在科研上,就连教学上还有巨大的差距。
具体安装方式是:
pip install "ipython[notebook]"
python -m IPython notebook
最后一个命令会运行一个本地服务器,注意启动时提醒的端口。打开浏览器,输入localhost:8888/tree即可以查看提供的服务。
安装ConvNetJS
从Github上下载convnetjs的代码。在本地生成这个html文件(命名为index.html):
minimal demo
但是马云你肯定是看不到的