机器为什么能识别图片里的数字很多人第一次接触机器学习或深度学习时都会觉得这件事很神奇为什么机器居然能识别图片里的数字比如一张手写数字图片人一眼就能看出它是 3、5 还是 8。但机器既没有眼睛也没有人的经验它到底是怎么做到这件事的如果这个问题没有想清楚后面再去看 MLP、CNN、LeNet很容易变成记模型名字、记网络结构、抄代码流程。所以在真正进入复杂模型之前有必要先把这个最基础的问题想明白机器为什么能识别图片里的数字一、先从一个最直观的事实开始机器其实不会“看图”人看图片时会自然看到轮廓、形状、笔画、结构。比如看到一个手写数字 8我们会觉得它“长得像 8”。但机器不是这样。对机器来说一张图片最开始并不是“8”甚至不是“数字”而只是一组数值。更准确地说一张图片可以看成一个由很多像素组成的矩阵每个位置上都有一个像素值。例如一张灰度图片可以简单表示成这样image[[0,0,255,255],[0,255,255,0],[0,0,255,0],[255,255,255,255]]这里的每个数字都代表一个像素点的亮度0表示更黑255表示更白也就是说在机器眼里图片首先不是“图像意义上的内容”而是一个数字矩阵。这件事非常重要。因为后面所有的图像分类模型本质上都不是在“看图”而是在处理这些数字并尝试从这些数字里找到模式。二、所谓“识别”本质上是在做分类如果把“识别图片里的数字”这件事说得更准确一点它其实不是一个神秘能力而是一个很明确的机器学习任务分类。什么叫分类就是给定一个输入让模型判断它属于哪个类别。例如输入一张手写数字图片输出0 到 9 中的某一个数字类别这就是一个典型的多分类问题。所以“机器识别数字”这件事本质上可以理解成机器根据输入图片判断它最可能属于哪个数字类别。这也是为什么“机器为什么能识别图片里的数字”会成为整条 LeNet 学习主线的起点问题。三、机器不是天生会分类而是在数据中慢慢学会的很多人会下意识觉得机器能识别数字是因为它内部有某种“识别规则”。这种理解只对了一半。更准确地说机器一开始其实并不会识别数字。它之所以后来能识别是因为它通过大量样本不断调整内部参数慢慢把“判断规则”学出来了。可以先把这个过程理解成下面几个步骤1. 输入一张图片这张图片对机器来说是一组像素值。2. 模型根据当前参数给出一个判断比如输出是 0 的可能性0.01是 3 的可能性0.92是 8 的可能性0.033. 把这个判断和真实答案进行比较如果真实标签就是 3说明模型这次判断得不错。如果真实标签是 8那说明它判断错了。4. 根据错误程度调整参数如果模型错得比较多就需要调整得更明显如果已经比较接近正确答案就只做小幅调整。这个过程不断重复以后模型内部的参数会越来越合适预测结果也会越来越准确。所以机器之所以能识别数字并不是因为它突然“懂了”而是因为它在大量数据中不断试错、不断修正最后学会了一套更好的分类规则。四、机器真正学到的不是“数字的意义”而是“数字的模式”这是一个很容易被误解的地方。人看到数字 3会知道它是“三”。这背后带有人的语言、经验和概念理解。但机器学习里的“学会识别 3”并不是这个意思。机器学到的并不是“3 的意义”而是什么样的像素分布、局部结构、整体形状更像数字 3。也就是说机器真正学到的是一种模式。比如同样是数字 3不同人写出来会有很多差异有人写得很瘦有人写得很圆有人写得倾斜有人写得断断续续虽然它们看起来并不完全一样但它们依然有一些共同特征。模型训练的目标就是尽量把这些共同模式找出来。所以机器不是在“记住每一张图片”而是在试图总结出哪些模式更像 3哪些模式更像 8哪些模式更像 5。五、一个最小示例图片在机器眼里到底是什么下面用一个极小的 Python 例子直观感受一下图片在程序里是什么样子。importnumpyasnp# 一个非常简单的 4x4 “图片”imagenp.array([[0,0,255,255],[0,255,255,0],[0,0,255,0],[255,255,255,255]])print(图片矩阵)print(image)print(\n图片形状,image.shape)print(左上角像素值,image[0,0])print(右下角像素值,image[3,3])运行结果图片矩阵 [[ 0 0 255 255] [ 0 255 255 0] [ 0 0 255 0] [255 255 255 255]] 图片形状 (4, 4) 左上角像素值 0 右下角像素值 255这个例子本身并不能完成“识别数字”但它说明了一件很关键的事图片进入程序以后本质上就是一个数组。而模型后面要做的就是在这个数组上进行计算、提取规律、输出类别。这也是为什么图像分类问题最后会自然走向更适合图像结构的网络设计比如卷积网络以及后面的 LeNet 主线 [1]。六、为什么这个问题值得单独讲清楚因为后面无论你学习的是线性分类模型感知机多层感知机 MLP卷积神经网络 CNNLeNet本质上都还是在解决同一件事怎样把输入变成更准确的分类结果。不同模型的差别不在于“是不是在做分类”而在于处理输入的方式不同表达能力不同适合的数据类型不同对图像结构的利用程度不同尤其当输入从普通数字特征变成图片时问题会变得更复杂。这也是为什么后面会专门讨论“如果输入变成一张图片网络还能像以前那样处理吗”这样的关键问题 [1]。七、几个最容易混淆的点1. 机器识别图片说明它像人一样理解了图像不完全是。机器的“识别”更接近于根据输入数值和训练出来的参数输出一个类别判断。它和人的理解方式并不一样。2. 图片对机器来说就是“看到一个数字”不是。对机器来说图片首先只是像素值组成的矩阵。至于这个矩阵是不是“像 3”是模型后续计算出来的结果。3. 只要图片能表示成数字分类就一定很容易也不是。图片虽然本质上是数字但这些数字之间有空间关系、局部结构和形状模式。正因为这种结构复杂才需要更合适的模型去处理。八、总结机器之所以能识别图片里的数字并不是因为它像人一样“看懂了图像”而是因为它把图像当作一组有结构的数值通过大量数据训练逐步学会了从输入到类别的映射关系。如果把这篇文章压缩成一句话那就是机器不是在理解图片而是在学习如何根据像素模式完成分类。这也是后面继续理解机器学习、神经网络、卷积网络以及 LeNet 的真正起点。
01 从 MLP 到 LeNet:机器为什么能识别图片里的数字
机器为什么能识别图片里的数字很多人第一次接触机器学习或深度学习时都会觉得这件事很神奇为什么机器居然能识别图片里的数字比如一张手写数字图片人一眼就能看出它是 3、5 还是 8。但机器既没有眼睛也没有人的经验它到底是怎么做到这件事的如果这个问题没有想清楚后面再去看 MLP、CNN、LeNet很容易变成记模型名字、记网络结构、抄代码流程。所以在真正进入复杂模型之前有必要先把这个最基础的问题想明白机器为什么能识别图片里的数字一、先从一个最直观的事实开始机器其实不会“看图”人看图片时会自然看到轮廓、形状、笔画、结构。比如看到一个手写数字 8我们会觉得它“长得像 8”。但机器不是这样。对机器来说一张图片最开始并不是“8”甚至不是“数字”而只是一组数值。更准确地说一张图片可以看成一个由很多像素组成的矩阵每个位置上都有一个像素值。例如一张灰度图片可以简单表示成这样image[[0,0,255,255],[0,255,255,0],[0,0,255,0],[255,255,255,255]]这里的每个数字都代表一个像素点的亮度0表示更黑255表示更白也就是说在机器眼里图片首先不是“图像意义上的内容”而是一个数字矩阵。这件事非常重要。因为后面所有的图像分类模型本质上都不是在“看图”而是在处理这些数字并尝试从这些数字里找到模式。二、所谓“识别”本质上是在做分类如果把“识别图片里的数字”这件事说得更准确一点它其实不是一个神秘能力而是一个很明确的机器学习任务分类。什么叫分类就是给定一个输入让模型判断它属于哪个类别。例如输入一张手写数字图片输出0 到 9 中的某一个数字类别这就是一个典型的多分类问题。所以“机器识别数字”这件事本质上可以理解成机器根据输入图片判断它最可能属于哪个数字类别。这也是为什么“机器为什么能识别图片里的数字”会成为整条 LeNet 学习主线的起点问题。三、机器不是天生会分类而是在数据中慢慢学会的很多人会下意识觉得机器能识别数字是因为它内部有某种“识别规则”。这种理解只对了一半。更准确地说机器一开始其实并不会识别数字。它之所以后来能识别是因为它通过大量样本不断调整内部参数慢慢把“判断规则”学出来了。可以先把这个过程理解成下面几个步骤1. 输入一张图片这张图片对机器来说是一组像素值。2. 模型根据当前参数给出一个判断比如输出是 0 的可能性0.01是 3 的可能性0.92是 8 的可能性0.033. 把这个判断和真实答案进行比较如果真实标签就是 3说明模型这次判断得不错。如果真实标签是 8那说明它判断错了。4. 根据错误程度调整参数如果模型错得比较多就需要调整得更明显如果已经比较接近正确答案就只做小幅调整。这个过程不断重复以后模型内部的参数会越来越合适预测结果也会越来越准确。所以机器之所以能识别数字并不是因为它突然“懂了”而是因为它在大量数据中不断试错、不断修正最后学会了一套更好的分类规则。四、机器真正学到的不是“数字的意义”而是“数字的模式”这是一个很容易被误解的地方。人看到数字 3会知道它是“三”。这背后带有人的语言、经验和概念理解。但机器学习里的“学会识别 3”并不是这个意思。机器学到的并不是“3 的意义”而是什么样的像素分布、局部结构、整体形状更像数字 3。也就是说机器真正学到的是一种模式。比如同样是数字 3不同人写出来会有很多差异有人写得很瘦有人写得很圆有人写得倾斜有人写得断断续续虽然它们看起来并不完全一样但它们依然有一些共同特征。模型训练的目标就是尽量把这些共同模式找出来。所以机器不是在“记住每一张图片”而是在试图总结出哪些模式更像 3哪些模式更像 8哪些模式更像 5。五、一个最小示例图片在机器眼里到底是什么下面用一个极小的 Python 例子直观感受一下图片在程序里是什么样子。importnumpyasnp# 一个非常简单的 4x4 “图片”imagenp.array([[0,0,255,255],[0,255,255,0],[0,0,255,0],[255,255,255,255]])print(图片矩阵)print(image)print(\n图片形状,image.shape)print(左上角像素值,image[0,0])print(右下角像素值,image[3,3])运行结果图片矩阵 [[ 0 0 255 255] [ 0 255 255 0] [ 0 0 255 0] [255 255 255 255]] 图片形状 (4, 4) 左上角像素值 0 右下角像素值 255这个例子本身并不能完成“识别数字”但它说明了一件很关键的事图片进入程序以后本质上就是一个数组。而模型后面要做的就是在这个数组上进行计算、提取规律、输出类别。这也是为什么图像分类问题最后会自然走向更适合图像结构的网络设计比如卷积网络以及后面的 LeNet 主线 [1]。六、为什么这个问题值得单独讲清楚因为后面无论你学习的是线性分类模型感知机多层感知机 MLP卷积神经网络 CNNLeNet本质上都还是在解决同一件事怎样把输入变成更准确的分类结果。不同模型的差别不在于“是不是在做分类”而在于处理输入的方式不同表达能力不同适合的数据类型不同对图像结构的利用程度不同尤其当输入从普通数字特征变成图片时问题会变得更复杂。这也是为什么后面会专门讨论“如果输入变成一张图片网络还能像以前那样处理吗”这样的关键问题 [1]。七、几个最容易混淆的点1. 机器识别图片说明它像人一样理解了图像不完全是。机器的“识别”更接近于根据输入数值和训练出来的参数输出一个类别判断。它和人的理解方式并不一样。2. 图片对机器来说就是“看到一个数字”不是。对机器来说图片首先只是像素值组成的矩阵。至于这个矩阵是不是“像 3”是模型后续计算出来的结果。3. 只要图片能表示成数字分类就一定很容易也不是。图片虽然本质上是数字但这些数字之间有空间关系、局部结构和形状模式。正因为这种结构复杂才需要更合适的模型去处理。八、总结机器之所以能识别图片里的数字并不是因为它像人一样“看懂了图像”而是因为它把图像当作一组有结构的数值通过大量数据训练逐步学会了从输入到类别的映射关系。如果把这篇文章压缩成一句话那就是机器不是在理解图片而是在学习如何根据像素模式完成分类。这也是后面继续理解机器学习、神经网络、卷积网络以及 LeNet 的真正起点。