《Arduino家居安全系统构建实战》——1.2 经典的机器学习问题:图像分类

1.2 经典的机器学习问题:图像分类

图像(特别是笔迹)识别是机器学习的一个经典问题。首先,这个问题有极其有益的应用。通过自动识别书信上的地址或者邮政编码,邮局就可以有效地分拣信件,免于人工进行这一乏味的工作;ATM机器如果能够识别金额,就可以在机器上存款,加快资金入账的速度,减少在银行排队的需求。想象一下,如果所有人类手写的文档都能够数字化,搜索和研究信息该有多么容易!其次,这个问题很难:人类的笔迹(即使是印刷体)有各种各样的变化(大小、形状、倾斜),人们可以毫无问题地识别不同人写的字母和数字,计算机处理起来却十分困难。这就是断定某人是真人还是计算机时CAPTCHA如此简单有效的原因。人类的大脑在识别字母和数字的能力上有着可怕的能力,即使这些图像严重失真也不在话下。

有趣的事实:CAPTCHA和reCAPTCHA

CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart,全自动区分计算机和人类的图灵测试)是设计用于区分人和机器人的一种机制。为了确保用户是一个真正的人,CAPTCHA显示一段故意打乱的文本,使自动化电脑程序难以分辨。更有趣的是,这一思路已经扩展为reCAPTCHA。reCAPTCHA显示两个图像而不仅仅是一个:其中一个用于过滤机器人,另一个是真正数字化的文本(见图1-1)。每当人们这样登录时,它还有助于存档文件的数字化,例如《纽约时报》的过刊,每次数字化一个词。

1.2.1 挑战:构建一个数字识别程序

我们所要解决的问题是“数字识别程序”,这个问题是直接从Kaggle.com机器学习竞赛中借用的。可以在网站上找到所有相关信息:http://www.kaggle.com/c/digit-recognizer

下面就是这道难题:我们有50000幅图像的数据集。每个图像是由一个人写下的单个数字,以28×28像素分辨率扫描,编码为灰度图像,每个像素使用256个可能的灰度中的一个(从全白到全黑)。我们知道每次扫描的正确答案,也就是那个人写下的数字。这一数据集被称作“训练集”。现在,我们的目标是编写一个程序,从训练集中学习,并使用该信息预测之前从未见过的图像:该图像是0,还是1,还是……

从技术上说,这是所谓的“分类”问题:目标是将图像分到已知的“类别”中,这就是“分类”的由来。在本例中,我们有10个类别,代表0~9的数字。机器学习的不同风格取决于所要解决的问题类型,分类只是其中之一,但可能是最有代表性的问题。我们将在本书介绍更多此类问题!

那么,如何解决这个问题?我们先从一个不同的问题开始,想象一下我们只有两个图像:0和1(见图1-2)。

假定现在我为你提供图1-3中的图像,并提出下列问题:图1-2中显示的两个图像中,哪个与图1-3最为相像?

作为人,我想你一定觉得这个问题太简单了:“很明显,是第一个。”就这一点而言,我想两岁大的孩子都会觉得很简单。真正的问题是,如何将大脑所变的“魔术”翻译成代码?

解决这个问题的方法之一是调换一下问题的措辞:最相似的图像是差别最小的图像。在这个框架下,可以开始“找出差异”,逐个像素比较两个图像。图1-4中的图像显示了差异的“热图”:两个像素差别越大,颜色就越深。

在我们的例子中,这种方法似乎很有效。第二个图像“大不相同”,中间有一个很大的黑色区域,而第一个图像(画出了两个“0”之间的差异)大部分是白色,只有稀少的深色区域。

1.2.2 机器学习中的距离函数

现在我们可以加总各个像素的差异,用单一数字总结两个图像的差异。这样,对于相似的图像可以得到一个较小的数,对于不相似的图像则得到较大的数。在此,我们可以定义两个图像的“距离”,以描述其接近的程度。绝对完全相同的两个图像距离为0,不同的像素越多,距离就越大。另一方面,我们知道距离为0的含义是完全匹配,也知道这是我们所希望出现的最佳状况。但是,我们的相似度计量是有局限性的。例如,如果你简单地复制一个图像,但是向左移动一个像素,逐个像素的距离可能会变得相当大,甚至是在图像本质上完全相同的情况下。

距离的概念在机器学习中很重要,以某种形式出现在大部分模型中。距离函数是将你所要实现的功能翻译为机器能够使用的形式的手段。通过减小事物(如两个图像)的复杂度,形成单一数字,算法就可能产生作用——在本例中,算法可以决定两个图像是否相似。与此同时,将复杂度减小为单一数字也会带来某些细节在“翻译中丢失”的风险,就像上述的图像移动的情况。

距离函数还常常以另一个名称出现在机器学习中:代价函数。两者本质上相同,只是从不同的角度看待问题。例如,如果我们试图预测一个数字,预测的误差——也就是预测值与实际值的差别——就是距离。但是,同样可以用代价描述这一情况:较大误差的“代价很高”,对模型的改进能够降低其代价。

1.2.3 从简单的方法入手

现在,我们暂时忽略上述问题,遵循一种在编写软件和开发预测模型中都很奇妙的方法,继续解决问题——最简单的方法能不能生效?先从简单的方法入手,看看会发生什么情况。如果这种方法有效,就没有必要采用复杂的方法,从而更快地解决问题。如果无效,你可以花费少量时间建立简单的概念验证模型,在此过程中通常可以学到很多关于问题空间的知识。无论如何,这都是一次胜利。

因此,现在我们要克制住过度思考和设计的欲望,我们的目标是采用自己认为可能成功的最简单方法,并在以后改进。我们可以做这样一件事:当必须确定图像所代表的的数字时,可以在包含50000个训练示例的已知库中搜索最类似(差异最小)的图像,并预测图像所代表的数字。

如果看上去像“5”,当然就肯定是“5”!

算法的轮廓如下:给定试图识别的28×28像素图像(“未知图像”)和50000个训练示例(28×28像素图像和一个标签),我们将:

计算未知图像和每个训练示例的总差值。

找出差值最小的训练示例(“最接近者”)。

预测“未知”与“最接近者”相同。

让我们开始动手吧!

时间: 2024-12-30 17:52:42

《Arduino家居安全系统构建实战》——1.2 经典的机器学习问题:图像分类的相关文章

《Arduino家居安全系统构建实战》——第1章 家居安全系统的入门知识

第1章 家居安全系统的入门知识 Arduino家居安全系统构建实战在这一章中,我们将会介绍如下的内容: 什么是家居安全基础设施它是如何工作的部署这样一个系统都需要些什么在当前条件下为安全系统所做的准备有线安全系统和无线安全系统传统系统与现代化家居安全系统为了紧紧跟随硬件的发展趋势,本书介绍了随处可见且价格极为低廉的平台--Arduino.今时今日,我们可以在各种各样的公共场所如中小学校.高等院校.小型企业或者公共机构见到这个小电路板的身影. Arduino平台因其众多的优势而著名,例如低廉的成本

《Arduino家居安全系统构建实战》——导读

前言 机器学习项目开发实战 如果你手里拿着这本书,我就可以认定你是对机器学习感兴趣的.NET开发人员了.你可能对编写C#应用程序很熟悉,开发的很有可能是业务线应用程序.以前你可能遇到过F#,也可能没有.而且,你很有可能对机器学习感到好奇.这一主题每天都见诸报端,因为它和软件工程有着很紧密的联系,但是使用的是不熟悉.看似有些抽象的数学概念.简而言之,机器学习看上去是有趣的主题.值得学习的实用技能,但是从哪里入手难以说清. 本书的意图是作为开发人员的机器学习入门书.我的主要目标是使熟悉代码编写的读者

《Arduino家居安全系统构建实战》——1.2 工作原理

1.2 工作原理 之前讨论了家居安全系统基本的组成部分,但是这些要素都是什么,它们是如何工作的呢?通过对它们进行分类,我们可以将一个安全系统分成两个部分. 1.2.1 硬件部分 一个基础设施的硬件要素必须能够胜任软件的所有技术需求.可以将它们进一步细分为3个不同的子类别.这种分类方式不应该被理解为具有排斥性,因为一个要素经常可以被分到多个子类别中,这种分类方式反而有助于你理解系统所执行的功能. 传感器:传感器将作为系统的感觉器官,其作用就如同人类的身体感官.它们的功能就是从环境中搜集信息,并将这

《Arduino家居安全系统构建实战》——1.6 传统系统与现代化的家居安全系统的比较

1.6 传统系统与现代化的家居安全系统的比较 最后,我们将给出一个传统系统与现代化系统之间的比较,值得指出的是,在面对不同需求的时候,它们各自都有着特定的用处,这些需求例如减少模型的复杂性,提高系统的可靠性,增加系统可用性以及向开发者提供丰富的信息. 以前,如果综合考虑到多种因素,例如价格.技术的成熟度以及现有的基础设施(连接)等,以一个较低的成本来实现一个可以实时管理的系统几乎是不可能的. 而在智能手机和平板电脑已经普及的今天,这些设备有足够的能力来将硬件收集的数据即时进行发送和接收,并实现这

《Arduino家居安全系统构建实战》——第1章 256级灰度

第1章 256级灰度 机器学习项目开发实战 构建自动识别数字图像的程序 如果你打算建立一个当前技术热点的列表,机器学习当然会名列前茅.然而,虽然这个术语到处出现,但是它的真实含义往往含混不清.它是和"大数据"或者"数据科学"一样的东西吗?它和统计学有何不同之处?表面上,机器学习似乎是一种奇特.令人畏惧的专业,使用令人眼花缭乱的数学知识和算法,和软件工程师的日常活动没有多少共同之处. 在本章以及本书余下的部分中,我的目标是和大家一起完成实际项目,以此阐明机器学习的原理

《Arduino家居安全系统构建实战》——1.3 部署安全系统的先决条件

1.3 部署安全系统的先决条件 如果你正在考虑部署一个安全系统,那么最有可能的原因就是你有这方面的关键需求.因此,在这里最重要的事情就是要准确地确定这种需求.如果做不到这一点,我们最终会步入歧途并造成损失或者导致半途而废. 如果并没有这种需求,你只是拥有着一颗对现代科技勇于探索的心,那么你可能是出于学习和娱乐的目的来设计这个系统,或者试图将自己的家打造成一个现代化的场所.你可以浏览一下这个行业的先进企业的网站以获得参考. 我们可以看到,大多数企业的系统是类似的,只是在某些部分存在一些差异,而这些

《Arduino家居安全系统构建实战》——2.5 训练第一个分类器

2.5 训练第一个分类器 实现通用算法之后,我们最终可以回到手上的问题--识别哪些消息是非垃圾短信,哪些是垃圾短信.Train函数的签名提供了目标的清晰概况:要获得分类器,需要一个示例训练集.一个标记化程序和选用的标记.我们已经得到了训练集,现在的目标是使用交叉验证指导分析,确定标记化程序和标记的最佳组合. 2.5.1 实现第一个标记化程序 考虑到上述情况,我们先完成可行的最简单工作,首先是标记化.我们所要做的是取得一个字符串,将其分解为单词,忽略大小写. 这项工作需要正则表达式:\w+模式匹配

《Arduino家居安全系统构建实战》——1.6 改进我们的模型

1.6 改进我们的模型 我们实现了可能有效的最愚蠢的模型,它也确实干得不错--93.4%的正确率.我们还能让它变得更好吗? 遗憾的是,对此没有通用的答案.除非你的模型预测已经100%正确,否则始终有可能改进,知道答案的方法只有一个:尝试各种方法,看看它们是否有效.构建好的预测模型涉及许多反复尝试,正确建立模型以快速迭代.试验和验证思路至关重要. 我们可以探索哪些方向?我可以不假思索地提出一些. 调整距离函数.我们在此使用的曼哈顿距离只是许多可能性中的一个,选择"正确"的距离函数通常是获

《Arduino家居安全系统构建实战》——1.1 家居安全的基础设施

1.1 家居安全的基础设施 当然,如果你被问到一个关于安全系统组成部分的问题,你可能会毫不犹豫地对这个问题做出回答,例如,你可能会就监控摄像头.运动传感器和报警器等设备侃侃而谈.但是你确实了解这些不同的组成模块了吗?你能清楚地说出它们之间所有的关联吗?你能详细地讲出它们的工作方式吗?你能准确地说出传统的系统和当前的系统的区别吗?不要着急,这些答案都将为你揭晓. 好了,现在我们这里已经有这些问题的答案了.安全基础设施包括了所有的硬件设备.软件部分以及它们之间关联的设计,将所有这些组件组合在一起构成