lecture1 课程介绍
- David Maris70年代阐述对计算机视觉的理解,首先是边缘和曲线,然后是2.5D,将深度信息或场景的不连续结合起来,最终将所有信息组合起来组成3D模型。
- 计算机视觉,最早用几何体去识别物体,然后是图像分割,90年代用adaboost算法面部识别。21世纪前十年,基于特征识别图像,识别关键特征。开始出现重要的数据集用来做目标识别。
- 2012年多伦多大学研发的七层卷积神经网络Alexnet在计算机视觉领域取得重大突破。
lecture2 图像分类
knn
- 现实中很少用来图像分割,一般用于低维数据。
- 图像间的距离
- 调参k:把训练集分成训练集及验证集,交叉验证。
knn应用
- 归一化数据使数据均值为0
- 维度过高考虑PCA降维
- 70%-90%数据用于分割训练集与验证集
- 如果运行时间过长,考虑近似近邻算法,如FLANN。
python 利用knn分类iris数据
# knn交叉验证 iris data
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV,train_test_split
iris = load_iris()
X = iris.data
y = iris.target
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.3)
# 调参
k_range = range(1,15)
weight_options = ['uniform','distance']
param_grid = {'n_neighbors':k_range,'weights':weight_options}
knn = KNeighborsClassifier(n_neighbors=5)
grid = GridSearchCV(estimator=knn,param_grid=param_grid,cv=10,scoring='accuracy')
grid.fit(x_train,y_train)
print '最佳参数:%s' % grid.best_params_ #k=8,distance
knn = KNeighborsClassifier(n_neighbors=8,weights='distance')
knn.fit(x_train,y_train)
print knn.score(x_test,y_test) #准确率 0.97
线性分类
线性分类模型f(x,W)=Wx+b
cifar-10图像是32*32*3=3072,10分类,则
W为10*3072矩阵,图像各像素被列成一列,b为10*1。
- 如果衡量W好坏?—损失函数
lecture3 损失函数与最优化
损失函数
多分类SVM损失函数,使正确类别获得得分高,损失为
正则化
防止过拟合,更喜欢权重分布均匀的参数。
L1正则化实现稀疏。
多维SVM损失函数为
其中N是训练集样本数,j是错误类别。
多维逻辑斯蒂回归–Softmax分类
令
,则
,损失函数
。
最优化目标函数:梯度下降法。
SVM得到类别得分,Softmax分类器得到属于该类别的概率,效果差不多。
最优化
找到w使损失函数最小化。SVM损失函数是凸函数,但如果扩展到神经网络,损失函数就不是凸函数了,是凹凸不平的复杂形状。
- 策略1:差劲的初始方案:随机搜索,准确率15.5%
- 策略2:随机本地搜索
W基础上产生一个扰动,只有
使损失函数更低,则会执行更新。
- 策略3:跟随梯度,沿最陡峭的方向下山。
计算梯度
数值梯度(近似)
在不计算出错的情况下,使用尽可能小的h,无法取到趋向0的极限,所以只是近似。中心差值公式 效果较好。步长是最重要超参数之一,小步长下降稳定但进度慢,大步长进展快但风险大。分析梯度
微分计算能快速得到梯度公式(不是近似),但容易出错,所以要和数值梯度作比较。
梯度下降
一般采用小批量数据梯度下降,数目一般选择32,64,128等。