实现KNN的作业代码
https://gitee.com/hubertsing/CS231n2020/tree/master
CIFAR10数据集
- 10个类别,共5w张数据图,和1w个测试图,每个图像32*32个像素,每个像素3个彩色通道。
驱动数据的方法(比深度学习,CNN更广泛):用质量高的数据集驱动
- Nearest Neighbor Classifier 最近邻分类器:
训练函数:接收图片和标签输出模型
def train(images,labels):
#Machine learing
return model
预测函数:接收一个模型进行预测
def predict(model,test_images):
#Use model to predict labels
return test_labels
曼哈顿距离L1
像素矩阵对应相减再求和,所以训练复杂度为O(1),预测复杂度为O(N)欧式距离L2
平方和的平方根K-Nearest Neighbor Classifier K最近邻分类器:
K越大越平滑
hyperparameters超参数:无法从训练数据中获得的参数
超参数的设置:
- 不能以训练数据的拟合结果最优为目的,因为K=1时训练数据总是性能最优,而K>1时往往对于未知数据集性能更好。
- 不能用训练集训练出多个超参数,使预测集性能最优。因为这样很可能我们得到的只是让这个预测集数据最优的超参数。我们希望的是能在未知的数据集上都能表现最优。
- 推荐做法:
- 将数据集分3类,分别是训练集(大部分),验证集,测试集。用多组超参数在训练集上训练,然后选择在验证集上表现最好的,最后用测试集评估算法。必须分隔验证集与测试集。
- 交叉验证(小数据集,非深度学习中使用):5份folder一份测试集,每个folder每次都只用其中一个作为验证集,剩下的作为训练集。
不足:
- 无法对平移遮挡和滤镜表现良好性能(L2距离可能不变),不适合image领域
- 维度灾难:需要指数倍增加数据来填充高维度的图片空间,使L1距离尽可能小。
线性分类
线性分类器是神经网络的组件
猫->f(x,W)->每个类别的相似度分数
x为输入数据,W为通过训练集训练出的权重矩阵参数(此时不再需要训练集)
f(x,W)=Wx+b,W为10*(32*32*3),x为(32*32*3)*1的矩阵,,b为10*1的偏置项(由于数据集的不均匀),输出10*1的列向量分数。W的每一行都是一个类别的模板图像,所以就会造成一个问题,线性分类器为每个类别只配备了一个模板图像,而神经网络图像不会只配备一个。
图像分类的难点:semantic gap
计算机视觉两个观点:具体图像的观察和平面图形的高维度
[1,2]的shape值(2,),意思是一维数组,数组中有2个元素。
[[1],[2]]的shape值是(2,1),意思是一个二维数组,每行有1个元素。
[[1,2]]的shape值是(1,2),意思是一个二维数组,每行有2个元素。
numpy函数说明文档:https://numpy.org/doc/stable/
jupyter notebook使用说明:https://blog.csdn.net/weixin_43135165/article/details/88429081
%matplotlib inline的作用:https://www.jianshu.com/p/2dda5bb8ce7d
代码参考https://blog.csdn.net/red_stone1/article/details/79238866
https://www.freesion.com/article/511039815/