cs231n笔记

第一课:李飞飞授课

cs231a —— 更宽泛、涵盖更全面的计算机视觉课程。cs231n专门讨论cnn。

CVPR, ICCV —— 重要的计算机视觉会议

Block world (Larry Roberts, 1963)

David Marr's book: VISION

Normalized Cut (Shi & Malik, 1997) 将图像分割为有意义的块

Face Detection (Viola & Jones, 2001)

SIFT & Object Recognition, David Lowe, 1999

Spatial Pyramid Matching, Lazebnik, Schmid & Ponce, 2006


总体梗概

课程描述

计算机视觉在我们的生活中随处可见,其应用包括搜索、图像解译、app、地理制图、医学、无人驾驶飞行器、以及自动驾驶汽车。许多这些应用的核心任务是图像识别,例如图像分类、定位和检测。神经网络技术的最近进展(即深度学习)极大的提升了这些最先进图像识别系统的性能。


重点关注:

如何建立图像识别问题,学习算法(例如反向传播法),训练并精细调整网络的工程应用技巧,通过上手操作的作业和最终的一个课程工程项目来指导训练学生。


课前具备的条件:

精通Python;高度熟悉C/C++

大学微积分;线性代数

基本概率统计

CS229的等效知识(机器学习)[将使用代价函数、求导数、使用梯度下降法求最优]


课程鼓励外部学习者:

作业、课程笔记、讲座视频、幻灯片可以在线获得。


完成作业需要掌握的工具:Python,and a few polular libraries(numpy, scipy, matplotlib)



knn分类器、线性分类器

knn分类器原理不复杂,笔记掠过。

线性分类器与CS229的部分内容一样。要点有:score function, loss function, gradient descend.

实际编程时注意:

初始化W为接近与0的随机数时,应当检验Multi-SVM损失函数 / softMax损失函数是否符合预期。具体为Multi-SVM损失函数C -1,而softMax损失函数为log(C),C为分类数。

寻优过程与CS 229类似。同样,计算梯度时,需要注意:

用数值法求得的梯度来检验解析公式得出的梯度。(所谓的Gradient Check)

图像特征提取:神经网络兴起之前,往往不直接将图像作为分类器的输入,而是先提取特征,再输入分类器。

常用的特征有:Color Histgram,Hisgram of Oriented Gradient (HoG),Bag of Words


反向传播

Computational Graph: 可以近似任何函数

用于计算前向传播,得到函数值;或计算反向传播,计算梯度。

(由于神经网络很复杂时,很难得到梯度的解析式,因此用Computational Graph来计算)


课程反向传播的notes部分,某个函数分解成计算图后,正向传播计算如下:

x = 3 # example values
y = -4

# forward pass
sigy = 1.0 / (1 + math.exp(-y)) # sigmoid in numerator   #(1)
num = x + sigy # numerator                               #(2)
sigx = 1.0 / (1 + math.exp(-x)) # sigmoid in denominator #(3)
xpy = x + y                                              #(4)
xpysqr = xpy**2                                          #(5)
den = sigx + xpysqr # denominator                        #(6)
invden = 1.0 / den                                       #(7)
f = num * invden # done! 

反向传播如下:

# backprop f = num * invden
dnum = invden # gradient on numerator                             #(8)
dinvden = num                                                     #(8)
# backprop invden = 1.0 / den 
dden = (-1.0 / (den**2)) * dinvden                                #(7)
# backprop den = sigx + xpysqr
dsigx = (1) * dden                                                #(6)
dxpysqr = (1) * dden                                              #(6)
# backprop xpysqr = xpy**2
dxpy = (2 * xpy) * dxpysqr                                        #(5)
# backprop xpy = x + y
dx = (1) * dxpy                                                   #(4)
dy = (1) * dxpy                                                   #(4)
# backprop sigx = 1.0 / (1 + math.exp(-x))
dx += ((1 - sigx) * sigx) * dsigx # Notice += !! See notes below  #(3)
# backprop num = x + sigy
dx += (1) * dnum                                                  #(2)
dsigy = (1) * dnum                                                #(2)
# backprop sigy = 1.0 / (1 + math.exp(-y))
dy += ((1 - sigy) * sigy) * dsigy                                 #(1)
# done! phew

其中,dnum的意思是 $$ \partial f / \partial num $$

同理 dx 意思是 $$\partial f / \partial x$$

其他的都类似。


卷积神经网络总体

Convolutional Neural Network 与 Fully Connected Neural Networks 相对。

设计CNN的结构、选择超参数是很费事费力的事情。90%的情况下,我们都从ImageNet中选择表现最好的网络结构,下载下来,再针对自己的具体数据精确调参。

对于Fully Connected Neural Networks,三层比两层表现更好,但是更深的网络则不然。而对于CNN,几乎越深的神经网络效果越好。

为了防止过拟合,一般不是通过降低层数,而是通过 L2 regularization, dropout, input noise等方法。小网络容易陷入较差的局部最优解,对初值依赖很强;而大网络则往往不会得到很差的解,对初值依赖性也不强。


一些实现细节

数据预处理:Zero Centering, Normalization。注意:这些操作在计算均值和方差时都是使用 training set,而不能用 validation set 和 test set。

权值初值:初始化为较小的随机数。初始化为标准的高斯分布,然后以1/sqrt(n)做校正(n是神经元的输入的维度),使得神经元的输出为标准高斯分布,这样可以提高收敛的概率。对于采用ReLU的神经网络,应当乘以sqrt(2/n)。

在 gradient checking 时使用双精度,而不是单精度,否则会因溢出出现较大的相对误差。

分开对 data loss和 regularization loss 进行梯度检验,防止一方的梯度过大吞噬掉另一方,从而检查不出另一方的错误。

再对大量数据进行学习前,把regularization调成0,学习少数几个随机样本(例如20个),使得网络对这几个数据过拟合。此时,理论上loss function应当为0。若不为零,说明学习过程中有错误。

猜你喜欢

转载自blog.csdn.net/laowulong350/article/details/79428254