什么是人工智能?
学习的能力,是智能的本质。
-
图像分类:计算机视觉核心任务
-
图像在计算机中长什么样呢?
一张图片被表示成三维数组的形式,每个像素的值从0-255
例如:3001003
-
挑战:照射角度
-
挑战:光照强度
-
挑战:形状改变
-
挑战:部分遮蔽
-
挑战:背景混入
-
Viewpoint variatio(视角变化)
-
Scale variation(尺度变化)
-
Illumination conditions(光照条件)
-
Deformation(形变)
-
Occlusion
-
Background clutter
-
Intra-class variation
常规方法:
- 收集数据并给定标签
- 训练一个分类器
- 测试,评估
def train(train_images, train_lablels):
# bulid a model for images -> labels
return model
def predict(model, test_images):
# predict test_labels using the model
return
K-近邻
-
如果K=3,绿色圆点的最近的3个邻居是两个红色小三角形和1个蓝色小正方形,基于统计的方法,判断绿色的这个待分类点属于红色的三角形一类。
-
如何K=5,绿色圆点的最近的5个邻居是2个红色三角形和3个蓝色的正方形,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。
KNN算法概述
- KNN算法本身简单有效,它是一种lazy-learning算法
- 分类器不需要使用训练集进行训练,训练时间复杂度为0
- KNN分类的计算复杂度和训练集中的文档数目成正比,也就是说,如果训练集中文档总数为n,那么KNN的分类时间复杂度为O(n)
- 该算法的三个基本要素:
- K值的选择
- 距离度量
- 分类决策规则
- 问题:该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数
- 解决:不同的样本给与不同的权重
数据库样例:CIFAR-10
- 10类标签
- 50000个训练数据
- 10000个测试数据
- 大小均为32*32
- 如何计算呢?
- 测试结果
- 最近邻代码
import numpy as np
class NearestNeighbor:
def __init__(self):
pass
def train(self, X, y):
"""X is N*D where each row is an example.Y is 1-dimension of size N"""
# the nearest neighbor classifier simply remembers all the training data
self.Xtr = X
self.ytr = y
def predict(self, X):
"""X is N*D where each row is an example we wish to predict label for"""
num_test = X.shape[0]
#lets make sure that the output type matches the input type
Ypred = np.zeros(num_test, dtype = self.ytr.dtype)
# loop over all test rows
for i in xrange(num_test):
# find the nearest training image to the i'th test image
# using the L1 distance (sum of absolute value differences)
distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
min_index = np.argmin(distances) # get the index with smallest distance
Ypred[i] = self.ytr[min_index] # predict the label of the nearest example
return Ypred
- 超参数
- L1(Manhattan) distance:
- L2(Euclidean) distance
- 问题:
- 对于距离如何设定?
- 对于K近邻的K该如何选择?
- 如果有的话,其它超参数该怎么设定呢?
- 找到最好的参数
-
多次用测试数据试验,找到最好的一组参数组合,这是错误的想法,因为测试数据只能最终用
-
测试结果:
使用验证集调节参数
- 实现K-近邻算法
-
选取超参数的正确方法是:
将原始训练集分为训练集和验证集,我们在验证集上尝试不同的超参数,最后保留表现最好的那个
-
如果数据量不够,使用交叉验证方法,他能够帮助我们在选取最优超参数的时候减少噪音
-
一旦找到最优的超参数,就让算法以该参数在测试集跑一次,并根据测试结果评价算法
-
最近邻分类器能够在CIF-10上得到将近40%的准确率。该算法简单易实现,但需要存储所有训练数据,并且在测试的时候过于耗费计算能力
-
最后,我们知道了仅仅使用L1和L2范数来进行像素比较是不够的,图像更多的是按照背景和颜色来分类,而不是语义主体
- 数据处理
-
预处理数据:
对数据中的特征进行归一化(normalize),让其具有零平均值(zero mean)和单位方差(unit variance)
-
如果数据是高维数据,考虑使用降维方法:比如PCA
-
将数据随机分入训练集和验证集。按照一般规律,70%·90%作为训练集
-
在验证集上调优,尝试足够多的K值,尝试L1和L2两种范数计算方式
- 在图像的不同变换和原图具有相同的L2距离时,K近邻不能区分两个图像——never used
线性分类
-
得分函数
-
实例
-
损失函数
-
损失函数对比
-
正则化(减少过拟合)
-
L2正则化
-
softmax分类器
-
最优化
想法一:不断随机W,得到最优的Loss
想法二:每次随机更新W,得到最优的Loss
想法三:梯度下降(Batchsize通常为2的整数倍(32,64,128))
-
学习率
-
反向传播
神经网络
- 正则化在神经网络中的作用(减少过拟合)
- 越多的神经元,就越能够表达复杂的模型(过于复杂的模型,会产生过拟合问题,使得训练较好,但没有更好的泛化能力)
- 激活函数
sigmoid函数(会产生梯度消失的问题)
RULE函数
BP网络的实现
- 数据预处理
- 权重初始化
- DROP-OUT
卷积神经网络
- 应用
- 卷积神经网络架构
- 输入大小为: W1 * H1 * D1
- 需要指定的超参数:filter个数(K),filter大小(F),步长(S),边界填充(P)
- 输出:
W2= (W1 - F + 2P)/S + 1
H2 = (H1 - F + 2P)/S + 1
D2 = K - 池化层(Pooling layer)
- AlexNet
- VGGNet
- Data Augmentation( need a lot of data)
- Horizontal flips
- Random crops/scales
- Horizontal flips
- Transfer Learning
Caffe ConvNet library has a “model Zoo” of pretrained models:(https://github.com/BVLC/caffe/wiki/Model-Zoo) - Design Conv Network
- Caffe
Step 1:Convert Data
Step 2:Define Net
Step 3:Define Solver
Step 4:Train