原文:[image classification notes]。

翻译:图像分类笔记(上)(下)。


cs231n课程中的一篇介绍性教程,以下为阿幻的学习笔记:

照例,先摘个大纲:

  • Intro to Image Classification, data-driven approach, pipeline
  • Nearest Neighbor Classifier
    • k-Nearest Neighbor
  • Validation sets, Cross-validation, hyperparameter tuning(验证集, 交叉验证, 超参数调参)
  • Pros/Cons of Nearest Neighbor(最近邻的优劣)
  • Summary
  • Summary: Applying kNN in practice
  • Further Reading(拓展阅读)

介儿下边就是我的笔记喽.


Image Clssesfication

任务:图像分类就是从已有的固定分类标签集合中选择一个并分配给一张图像。

挑战:

  • 视角变化(Viewpoint variation
  • 大小变化(Scale variation
  • 形变(Deformation
  • 遮挡(Occlusion
  • 光照条件(Illumination conditions):在像素层面上,光照的影响非常大。
  • 背景干扰(Background clutter
  • 类内差异(Intra-class variation

Data-driven approach

The image classification pipeline.(流程)

  • Input: Our input consists of a set of N images, each labeled with one of K different classes. We refer to this data as the training set.
  • Learning: Our task is to use the training set to learn what every one of the classes looks like. We refer to this step as training a classifier, or learning a model.
  • Evaluation: In the end, we evaluate the quality of the classifier by asking it to predict labels for a new set of images that it has never seen before. We will then compare the true labels of these images to the ones predicted by the classifier. Intuitively, we’re hoping that a lot of the predictions match up with the true answers (which we call the ground truth).

Nearest Neighbor Classifier

Nearest Neighbor Classifier has nothing to do with Convolutional Neural Networks and it is very rarely used in practice.

基本思想是通过将测试图像与训练集带标签的图像进行比较,来给测试图像打上分类标签。

那么具体如何比较两张图片(像素块)呢?

最简单的方法就是逐个像素比较,最后将差异值全部加起来。换句话说,就是将两张图片先转化为两个向量,然后计算他们的L1 distance:

L2 distance, which has the geometric interpretation of computing the euclidean distance between two vectors. (几何学的角度,可以理解为它在计算两个向量间的欧式距离)

L1和L2比较。比较这两个度量方式是挺有意思的。在面对两个向量之间的差异时,L2比L1更加不能容忍这些差异。也就是说,相对于1个巨大的差异,L2距离更倾向于接受多个中等程度的差异。L1和L2都是在p-norm常用的特殊形式。

k - Nearest Neighbor Classifier

k-Nearest Neighbor Classifier. The idea is very simple: instead of finding the single closest image in the training set, we will find the top k closest images, and have them vote on the label of the test image.

上面示例展示了Nearest Neighbor分类器和5-Nearest Neighbor分类器的区别。例子使用了2维的点来表示,分成3类(红、蓝和绿)。不同颜色区域代表的是使用L2距离的分类器的决策边界。白色的区域是分类模糊的例子(即图像与两个以上的分类标签绑定)。需要注意的是,在NN分类器中,异常的数据点(比如:在蓝色区域中的绿点)制造出一个不正确预测的孤岛。5-NN分类器将这些不规则都平滑了,使得它针对测试数据的泛化(generalization)能力更好(例子中未展示)。注意,5-NN中也存在一些灰色区域,这些区域是因为近邻标签的最高票数相同导致的(比如:2个邻居是红色,2个邻居是蓝色,还有1个是绿色)。


Validation sets for Hyperparameter tuning

hyperparameters(超参数)

Evaluate on the test set only a single time, at the very end.(决不能使用测试集来进行调优,测试数据集只使用一次,即在训练完成后评价最终的模型时使用)

不用测试集调优的方法思路是:从训练集中取出一部分数据用来调优,我们称之为验证集。把训练集分成训练集和验证集(validation set)。使用验证集来对所有超参数调优。最后只在测试集上跑一次并报告结果。

Cross-validation(交叉验证)

将训练集平均分成5份,其中4份用来训练,1份用来验证。然后我们循环着取其中4份来训练,其中1份来验证,最后取所有5次验证结果的平均值作为算法验证结果。

这就是5份交叉验证对k值调优的例子。针对每个k值,得到5个准确率结果,取其平均值,然后对不同k值的平均表现画线连接。本例中,当k=7的时算法表现最好(对应图中的准确率峰值)。如果我们将训练集分成更多份数,直线一般会更加平滑(噪音更少)。In

practice

交叉验证会耗费较多的计算资源。一般直接把训练集按照50%-90%的比例分成训练集和验证集。根据具体情况来定的:如果超参数数量多,你可能就想用更大的验证集,而验证集的数量不够,那么最好还是用交叉验证吧。至于分成几份比较好,一般都是分成3、5和10份。


Pros and Cons of Nearest Neighbor classifier.

优点: Nearest Neighbor分类器易于理解,实现简单。

缺点: (1) 测试花费的时间远远大于训练花费的时间.

   算法的训练不需要花时间(因为其训练过程只是将训练集数据存储起来)。然而测试要花费大量时间计算,因为每个测试图像需要和所有存储的训练图像进行比较。

Nearest Neighbor分类器的计算复杂度研究是一个活跃的研究领域,若干Approximate Nearest Neighbor (ANN)算法和库的使用可以提升Nearest Neighbor分类器在数据上的计算速度(比如:FLANN)。这些算法可以在准确率和时空复杂度之间进行权衡,并通常依赖一个预处理/索引过程,这个过程中一般包含kd树的创建和k-means算法的运用。(不懂,看看就好)

(2) Nearest Neighbor分类器在某些特定情况(比如数据维度较低)下,可能是不错的选择。但是在实际的图像分类工作中,很少使用。因为图像都是高维度数据(他们通常包含很多像素),而高维度向量之间的距离通常是反直觉的。下面的图片展示了基于像素的相似和基于感官的相似是有很大不同的:

在高维度数据上,基于像素的的距离和感官上的非常不同。上图中,右边3张图片和左边第1张原始图片的L2距离是一样的。很显然,基于像素比较的相似和感官上以及语义上的相似是不同的。

原始图片的距离被背景主导而不是图片语义内容本身主导。


Summary

  • 介绍了Image classesfication,即给定带有标签的图像数据集,预测没有标签的图片的类别和算法预测准确度.
  • 介绍了Nearest Neighbor classifier,分类器中存在不同的超参数(比如k值或距离类型的选取)
  • 选取超参数的正确方法是:将原始训练集分为训练集和验证集(validation set),我们在验证集上尝试不同的超参数,最后保留表现最好那个。
  • 如果训练数据量不够,使用交叉验证方法,它能帮助我们在选取最优超参数的时候减少噪音。
  • 一旦找到最优的超参数,就让算法以该参数在测试集跑且只跑一次,并根据测试结果评价算法。
  • 最近邻分类器能够在CIFAR-10上得到将近40%的准确率。该算法简单易实现,但需要存储所有训练数据,并且在测试的时候过于耗费计算能力。
  • 最后,我们知道了仅仅使用L1和L2范数来进行像素比较是不够的,图像更多的是按照背景和颜色被分类,而不是语义主体分身。

Summary: Applying kNN in practice

如果你希望将k-NN分类器用到实处(最好别用到图像上,若是仅仅作为练手还可以接受),那么可以按照以下流程:

  1. 预处理你的数据:对你数据中的特征进行归一化(normalize),让其具有零平均值(zero mean)和单位方差(unit variance)。(本小节不讨论,是因为图像中的像素都是同质的,不会表现出较大的差异分布,也就不需要标准化处理了。)
  2. 如果数据是高维数据,考虑使用降维方法,比如PCA(wiki ref, CS229ref, blog ref)或随机投影。
  3. 将数据随机分训练集和验证集。按照一般规律,70%-90% 数据作为训练集。这个比例根据算法中有多少超参数,以及这些超参数对于算法的预期影响来决定。如果需要预测的超参数很多,那么就应该使用更大的验证集来有效地估计它们。如果担心验证集数量不够,那么就尝试交叉验证方法。如果计算资源足够,使用交叉验证总是更加安全的(份数越多,效果越好,也更耗费计算资源)。
  4. 验证集上调优,尝试足够多的k值,尝试L1和L2两种范数计算方式。
  5. 如果分类器跑得太慢,尝试使用Approximate Nearest Neighbor库(比如FLANN)来加速这个过程,其代价是降低一些准确率。
  6. 对最优的超参数做记录。记录最优参数后,千万不要在最终的分类器中使用验证集数据,这样做会破坏对于最优参数的估计。直接使用测试集来测试用最优参数设置好的最优模型,得到测试集数据的分类准确率,并以此作为你的kNN分类器在该数据上的性能表现。

拓展阅读

下面是一些你可能感兴趣的拓展阅读链接:

  • A Few Useful Things to Know about Machine Learning,文中第6节与本节相关,但是整篇文章都强烈推荐。
  • Recognizing and Learning Object Categories,ICCV 2005上的一节关于物体分类的课程。

demo

Example image classification dataset: CIFAR-10.(点击可以下载,记得下载python格式)

代码(点击进入我的github)

运行结果:

上面为L1距离, 下面是L2距离.

这个预测真的是慢,慢的我以为电脑卡死了(捂脸)


转载于:https://www.cnblogs.com/guweixin/p/10433055.html

[cs231n][Module 1: Neural Networks] Image Classification相关推荐

  1. 《Naturalization Module in Neural Networks for Screen Content Image Quality Assessment》解读

    <基于神经网络中自然化模型的屏幕图像质量评价> 数据库:SIQAD [1],SCID [2] 衡量指标:Pearson Linear Correlation Coefficient (PL ...

  2. 【阅读】A Comprehensive Survey on Electronic Design Automation and Graph Neural Networks——EDA+GNN综述翻译

    转载请注明出处:小锋学长生活大爆炸[xfxuezhang.blog.csdn.net] Paper原文:https://dl.acm.org/doi/pdf/10.1145/3543853​​​​​​ ...

  3. PRML学习总结(5)——Neural Networks

    PRML学习总结(5)--Neural Networks 5.1 Feed-forward Network Functions 5.1.1 Weight-space symmetries 5.2 Ne ...

  4. 【文本分类】Recurrent Convolutional Neural Networks for Text Classification

    ·摘要:   从模型的角度,本文作者将RNN(Bi-LSTM)和max_pooling结合使用,提出RCNN模型,应用到了NLP的文本分类任务中,提高了分类精度. ·参考文献:   [1] Recur ...

  5. 【多标签文本分类】Initializing neural networks for hierarchical multi-label text classification

    ·阅读摘要:   本文在<Improved Neural Network-based Multi-label Classification with Better Initialization ...

  6. 【文本分类】Convolutional Neural Networks for Sentence Classification

    ·摘要:   本文作者将CNN引用到了NLP的文本分类任务中. ·参考文献:   [1] Convolutional Neural Networks for Sentence Classificati ...

  7. 二值网络--Structured Binary Neural Networks for Accurate Image Classification and Semantic Segmentation

    Structured Binary Neural Networks for Accurate Image Classification and Semantic Segmentation https: ...

  8. 二值网络--XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks

    XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks ECCV2016 http://allenai ...

  9. AlexNet- ImageNet Classification with Deep Convolutional Neural Networks

    ImageNet Classification with Deep Convolutional Neural Networks Advances in Neural Information Proce ...

最新文章

  1. p2v、v2v 转换-windows篇
  2. UA MATH563 概率论的数学基础 中心极限定理16 Kolmogorov 3-series定理
  3. 蓝凌ekp开发_新华教育集团战略升级,携手蓝凌量身定制数字化办公平台
  4. iphone自定义铃声
  5. php smtp验证,php通过smtp验证登陆
  6. 单元格格式_单元格格式的用法你知道吗~~
  7. can通道采样频率_CAN采样点设置为多少合适?设置不对会咋样?
  8. “.NET研究”谈谈C# 4.0新特性“缺省参数”的实现
  9. 33 个 JavaScript 核心概念系列(四): == 与 ===
  10. 关于计算机设计的英语作文,一篇关于计算机的看法的英语作文
  11. Vertically aligning HTML
  12. 程序的内存分配----变量在可执行文件中的内存区分配
  13. 快速的mysql导入导出数据(load data和outfile)
  14. 每一个写博客的程序猿,都应该被温柔对待
  15. DM数据库查询错误码
  16. 前端js如何实现中文转拼音(重要)
  17. 一文读懂反向传播算法原理
  18. 多机器人路径规划CBS/ECBS等 libmultiRobotPlanning 代码阅读笔记
  19. 如何利用通达信进行选股集合操作
  20. Uni-app 实战社区交友类app开发

热门文章

  1. echarts 3d地球 背面光线太暗_国内超炫裸眼3D案例鉴赏,大家更喜欢那一个!
  2. 蓝彗星(差分+前缀和)
  3. android模拟点击滑动,模拟Android的view点击和滑动监听
  4. 读写自旋锁 linux,boost是否像Linux一样提供读写自旋锁机制?
  5. CDH修改PySpark默认的Python版本
  6. Ubuntu16.04再次装机记
  7. for of 与 for in的区别
  8. 第二次扩大会议(3.19)
  9. try,catch,finally
  10. JS高程5.引用类型(6)Array类型的位置方法,迭代方法,归并方法