斯坦福大学cs231n (图像分类)

news2024/9/20 7:53:33

1.介绍

当作图像分类时,分类系统接收一些分类图像,比如猫咪。并且系统清楚了一些已经确定了分类或者标签的集合。那么,计算机的工作就是根据图片,给他分配一些固定的分类或者标签。

对于一个计算机来说,这是一个非常困难的事情。当一个计算机看到这些图片时,他看到的是一大堆数字。比如,这个图片是800*600的像素,每一个像素由三个数字表示,用来表示像素的红、绿、蓝三个值,这将是一个巨大的数字阵列,这很难提取猫咪的特性。我们把这种问题成为语义鸿沟。

一只猫咪的语义概念和计算机实际看到的像素值之间有着巨大的差距,图像稍微一点的变化,都会导致数字阵列完全不同。然而,我们希望我们的算法是鲁棒的。

再进行图像分类时,图片可能发生以下变化:

  • 摄像机从多个角度拍摄
  • 照明情况有亮有暗
  • 形状会发生变化
  • 有遮挡物遮挡
  • 图片中的物体与背景较为相似,难以辨认
  • 每一类物体多种多样

2.数据驱动

2.1 硬编码

首先,根据所给图像,提取出边缘线条。然后,设定一些规则(比如:什么样的线条代表什么特征),去判断该图像中的物体是什么类别。然而,这种硬编码的方式效果并不是很好。

2.2 数据驱动算法

我们不写具体的分类规则来识别一个物体,我们采取的方式是,抓取大量猫的图片数据集,接着,训练机器来分类这些图片。(机器会收集这些数据,用某种方式总结,然后生成一个模型,总结识别出这些不同类的对象的核心知识要素),然后,我们用这些模型识别新的图片。

因此,这种方式一般包含两个函数。一个是训练函数,根据输入的数据集,得出一个模型。另一个是预测函数,根据输入的数据集进行预测。

3 最近邻算法

这种方法只是单纯的记录数据,在图片预测时,我们会拿一些新的图片,去在训练数据中,寻找与新图片最相似的,基于此,给出一个标签。

3.1 CIFAR-10数据集

CIFAR-10是一个很常用的数据集。数据集CIFAR-10会给出10个不同的类别,比如,飞机、汽车、鸟、猫等等。每个类别会给出五万张训练数据图,另外有一万个额外的测试数据图。

在该图中,右半部分表示对一个测试图片,找到和它最接近的十个训练图片。

比较两个图片是否相似时,可以用到一些距离度量计算方法。

3.2 L1距离(曼哈顿距离)

d_{1}(I_{1},I_{2})=\sum_{P}^{}\left | I_{1}^{P} -I_{2}^{P}\right |

  • p为像素点,I^{P}表示第p个像素点

假设我们的测试图片是4x4的小图片,将测试图片与训练图片对应位置的值相减取平均值,再将这些差值进行相加。

实现方式很简单,如下图所示。

因为我们在做预测时可能希望它发生在手机上或者浏览器上等等,不具有较强大的计算能力,所以,我们希望一个模型训练时可以慢一些,在测试时要尽量快一点。从这一点上看,最近邻算法并不是一个很好的算法。

并且该算法的准确率较低,因此后面还会介绍其他算法。

3.3 L2距离(欧式距离)

d_{2}(I_{1},I_{2})=\sqrt{\sum_{P}^{}(I_{1}^{P}-I_{2}^{P})^{2}}

该方式是先计算对应像素值的差,再将差值平方相加取根值。

L1距离取决于你选择的坐标系统,如果转动坐标轴,将会改变点之间的L1距离,而改变坐标轴对L2距离毫无影响。

如果输入的特征向量中的一些值具有重要的意义,那么建议选择L1距离,二u过输入的特征向量只是普通的向量,那么建议选择L2距离。当然,在解决实际问题中,更建议分别使用两种距离度量的方法,比较选出较为合适的一种方式。

3.4 K最近邻分类器

只是用最相似的一张图片的标签作为测试图片的预测,往往效果并不好。因此,我们可以使用KNN算法:选取相似的K个图片,选择其中数量最多的标签,作为对测试图片的预测。

特例:K=1即最近邻算法。

上图分别展示了原始数据,K=1的KNN算法以及K=5的KNN算法。我们可以发现K变大后,分类边界线趋于平滑。其中,中间的白色区域,表示不确定为何种分类。

3.4.1 超参数

像K值的选取与度量方法的选择都不是通过训练学习可以得到的,而是需要我们提前设置好的参数,称为超参数,那么超参数的选择就格外重要,可能直接影响一个模型效果的好坏。

  • 首先,不可以使用训练集进行超参数调优。如果在训练集上调优,我们可以发现K=1时,效果总是很好。但是正如前面所说,K变大后,曲线更趋于平滑,即使其中可能个别数据出现错误,但是对于位在训练集中出现的数据往往会得到较好的效果。
  • 其次,也不可以使用测试集进行超参数调优。如果使用测试集调优,使用在测试集中表现最好的K值后,在使用测试机进行预测,那么相当于测试机过拟合,往往预期的性能好于实际的性能。

解决方式:

  1. 将数据划分为训练集、验证集和测试集。在验证机上对不同的K值进行比较,选择效果最佳的K值,然后,使用测试集对算法进行评价。
  2. 交叉验证。使用交叉验证时,将训练集划分为五部分,其中四份用来训练数据,另外一份用来验证数据。我们将每一份数据集以此作为验证集,最后取5次验证结果的平均值作为验证结果。

如下图所示,针对不同的K值,产生了五个验证结果,取其平均值,作为最终验证结果。我们可以在图中发现,当K=7时,模型效果是最好的。

但是,在很多图像分类的问题上,我们并不建议使用KNN算法,原因如下:

  • 测试花费大量时间。因为需要将测试图片与每一个训练图片进行比较,所以花费时间较多。
  • 使用像素差异来比较图片是远远不够的。使用像素差异进行比较的话,往往最终结果的好坏依赖于背景,背景相似的图片可能相差距离都比较小。举例:将原始图片向下移动两个单位距离,可能像素差异会非常大,但是显而易见,这两张图片应该属于一个类别。
  • 维度灾难。KNN算法有点类似训练数据将样本空间分成几块,如果我们希望分类器有较好的结果,那么就需要训练数据能密集地分布在空间中,否则最近邻点的实际距离可能很远,也就是说,和待测样本的相似度没有那么高。然而问题在于,想要密集地分布在空间中,我们需要指数倍的训练数据,这会导致训练数量猛增。

4 线性分类

4.1 线性分类介绍

KNN模型所做的就是把训练数据存储起来,并且在训练过程中不会产生参数(K为人为设定的,是超参数,不是这里提到的参数概念)。在预测时,将测试图片与训练图片进行比较,然后预测。

与之不同的是参数模型,其中,线性分类就是最简单的参数模型。参数模型通常指根据输入的训练数据,得到权重W或者\vartheta,在之后的预测中,将不会在使用训练数据,而是与这组权重参数进行某种运算做出预测。

线性分类模型:f(x_{i},W,b)=Wx_{i}+b

其中,参数W表示权重矩阵,参数b是偏置项。

在该例子中,将图片的像素值拉成[3072x1]的列向量,W大小为[10x3072],B的大小为[10x1],最后输出为[10x1]的列向量,分别对应了不同分类得到的分值。

参数矩阵W相当于多个分类器的组合,每一行代表一个分类器。

线性分类器在利用学习到的模板,和输入图像做模板匹配。我们设置可以把其视作一种高效的KNN,不同的是不再使用所有的训练集的图像来比较,而是每个类别只用了一张图片来表征(这张图片是我们学习到的模板,而不存在训练集中),而且我们会更换度量标准,使用(负)内积来计算向量间的距离,而不是使用 L1 或者 L2 距离。

如果我们将3072维空间假设为二维空间,我们可以看到效果如上图所示。每输入的一张图片代表一个点,三个颜色的直线,代表三个分类器。

线性分类并不能解决所有的问题。比如上图展示的三种情况,都无法使用线性将其分类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2083030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CVPR‘24】DeCoTR:使用 2D 和 3D 注意力增强深度补全

DeCoTR: Enhancing Depth Completion with 2D and 3D Attentions DeCoTR: Enhancing Depth Completion with 2D and 3D Attentions 中文解析摘要介绍方法方法3.1 问题设置3.2 使用高效的 2D 注意力增强基线3.3 3D中的特征交叉注意力点云归一化位置嵌入3.4 捕捉 3D 中的全局上下…

软件测试常见面试题汇总(2024版)

一、常见的面试题汇总 1、你做了几年的测试、自动化测试,说一下 selenium 的原理是什么? 我做了五年的测试,1年的自动化测试; selenium 它是用 http 协议来连接 webdriver ,客户端可以使用 Java 或者 Python 各种编…

MySQL的InnoDB、MyISAM的参数及常见错误码

1:参数 参数,也被称之为MySQL的系统变量,这些变量是影响MySQL运行的关键,对每个参数做出不同调整,都有可能直接影响到线上数据库的性能,具体的完整系统参数可参考《MySQL官网文档-系统变量》,官…

图表检测检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

图表检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

通过写文件方式写入 Hive 数据

通过写文件方式写入 Hive 数据 Hive最简单的写入数据方式就是通过Hive Jdbc写入Hive数据,但这并不是写入Hive最高效的方法。 Hive通过读取相关Hdfs的文件来获取数据信息,而通过直接写入Hdfs文件数据达到写入Hive数据的效果,这是目前最高效的…

《python语言程序设计》2018版第8章第2题检测子串,你可以用str类中的find方法检测一个字符串

我先用in来做一次 def find_text(text_input1, text_input2):a str(text_input1)b str(text_input2)if b in a:print(f"The {b} is in {a} ")else:print(f"The {b} is not in {a} ")text_n1 "Welcome to shenyang" text_n2 "to"fi…

zdppy_cache缓存框架升级,支持用户级别的缓存隔离,支持超级管理员管理普通用户的缓存

启动服务 import zdppy_api as api import zdppy_cachekey1 "admin" key2 "admin"app api.Api(routes[*zdppy_cache.zdppy_api.cache(key1, key2, api) ])if __name__ __main__:import zdppy_uvicornzdppy_uvicorn.run(app, host"0.0.0.0",…

JVM-类加载过程

类加载过程是 Java 虚拟机 (JVM) 将 Java 代码编译后的字节码文件加载到内存中,并进行解析和验证,最终使程序能够运行的关键步骤。 类加载过程:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。 1. 加载…

Vitis AI 基本认知(Tiny-VGG 标签获取+预测后处理)

目录 1. 简介 2. 解析 2.1 获取标签 2.1.1 载入数据集 2.1.2 标签-Index 2.1.3 保存和读取类别标签 2.2 读取单个图片 2.3 载入模型并推理 2.3.1 tiny-vgg 模型结构 2.3.2 运行推理 2.4 置信度柱状图 2.5 预测标签 3. 完整代码 4. 总结 1. 简介 本博文在《Vitis …

Python酷库之旅-第三方库Pandas(105)

目录 一、用法精讲 456、pandas.DataFrame.rdiv方法 456-1、语法 456-2、参数 456-3、功能 456-4、返回值 456-5、说明 456-6、用法 456-6-1、数据准备 456-6-2、代码示例 456-6-3、结果输出 457、pandas.DataFrame.rtruediv方法 457-1、语法 457-2、参数 457-3…

云计算实训38——docker网络、跨主机容器之间的通讯

一、docker⽹络 1.桥接--bridge 所有容器连接到桥就可以使⽤外⽹,使⽤nat让容器可以访问外⽹ 使⽤ ip a s指令查看桥,所有容器连接到此桥,ip地址都是 172.17.0.0/16 ⽹段,桥是启动docker服务后出现,在centos使⽤ br…

centos安装mysql8.0版本,并且实现远程连接

一、 卸载mysql 查看mysql安装情况 rpm -qa | grep -i mysql 删除上图中所有信息 rpm -ev mysql-community-release-el7-5.noarch --nodeps 再次查询,没有数据,则为删除干净 find / -name mysql rm -rf /var/lib/mysql 将机器上的所有mysql相关文…

一篇文章带你真正了解接口测试(附视频教程+面试真题)

一、什么是接口测试? 所谓接口,是指同一个系统中模块与模块间的数据传递接口、前后端交互、跨系统跨平台跨数据库的对接。而接口测试,则是通过接口的不同情况下的输入,去对比输出,看看是否满足接口规范所规定的功能、…

79.位域

目录 一.位域的概念 二.语法格式 三.无名位域 四.视频教程 一.位域的概念 有些数据在存储的时候并不需要一个完整的字节。比如使用一个变量表示开关的状态,开关只有开和关俩个状态,所以只需要使用0和1表示,也就是一个二进制位。所以这时候…

前端提升之——chrome浏览器插件开发指南——chrome插件介绍及入门

前言 有一天突发奇想,想要自己写一个浏览器插件玩一玩,并不做用于商业或者其他方面,仅仅用于自我技术的练习和提升。 这里的浏览器我选择Chrome,当然chrome插件同样适用于微软自带的 Microsoft Edge 在当今发达的互联网环境下&…

云微客短视频矩阵如何打造多元化的视频内容呢?

随着抖音、快手等平台的兴起,短视频已经成为了人们日常生活的一部分,也有不少企业通过短视频赛道实现了品牌曝光和获客引流,但是单一的视频内容终究很难长久的吸引用户,所以如何打造多元化的视频内容呢? 在这个快节奏的…

【二叉树】OJ题目

🌟个人主页:落叶 目录 单值⼆叉树 【单值二叉树】代码 相同的树 【相同二叉树】代码 对称⼆叉树 【对称二叉树】代码 另一颗树的子树 【另一颗树的子树】代码 二叉树的前序遍历 【二叉树前序遍历】代码 二叉树的中序遍历 【二叉树中序遍历】…

【数据结构】栈和队列相互实现

目录 栈实现队列 思路 入队列 出队列 获取队头元素 队列实现栈 思路 入栈 出栈 获取栈顶元素 完整代码 栈实现队列 队列实现栈 栈实现队列 思路 栈的特点是 先进后出, 队列的特点是 先进新出,这就意味着我们无法通过一个栈来实现队列&…

YOLOv5改进 | 融合改进 | C3融合Efficient Multi-Scale Conv Plus【完整代码】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录: 《YOLOv5入门 改…

生成式AI扩散模型-Diffusion Model【李宏毅2023】概念讲解、原理剖析笔记

目录 一、Diffusion的基本概念和运作方法 1.Diffusion Model是如何运作的? 2.Denoise模块内部正在做的事情 如何训练Noise predictor? 1)Forward Process (Diffusion Process) 2)noise predictor 3.Text-to-Image 4.两个A…