11 从 MLP 到 LeNet:为什么图像不能简单当成普通向量来处理?

张开发
2026/4/17 13:35:14 15 分钟阅读

分享文章

11 从 MLP 到 LeNet:为什么图像不能简单当成普通向量来处理?
为什么图像不能简单当成普通向量来处理很多人第一次接触图像分类时都会有一个很自然的想法图片不就是一堆数字吗既然神经网络本来就能处理数字输入那把图片转成数字后直接送进模型不就行了吗这个想法不算错。因为从数据形式上看图片确实可以表示成数值矩阵进一步也可以 reshape 或 flatten 成一串向量。但问题在于能输入模型不等于这种处理方式最适合图像。图像任务真正难的地方从来不只是“图片能不能变成数字”而是这些数字之间是什么关系图像和普通表格数据到底有什么不同把图片直接展平之后模型到底失去了什么这篇文章就专门把这个问题讲清楚。1. 图片当然可以变成数字但这只是开始机器并不是像人一样“看懂图片”而是把图片当成一组数值再通过训练去学习这些数值模式和类别之间的对应关系 。比如一张灰度图本质上就是一个二维数组每个位置是一个像素每个像素对应一个数值这些数值共同组成整张图像所以如果只问一句图片能不能作为模型输入答案当然是能。但如果继续追问只要图片能表示成数字分类是不是就和普通数值任务一样了答案就不是了。因为图片虽然本质上也是数字但这些数字之间有空间关系、局部结构和形状模式正因为这种结构复杂才需要更合适的模型去处理 。换句话说图像不是普通数字它是“有结构的数字”。2. 先看一个最简单的小实验图片确实可以 flatten先别急着谈卷积我们先用一个最简单的例子看一下importnumpyasnp imgnp.array([[1,1,0,0],[1,1,0,0],[0,0,2,2],[0,0,2,2]])print(原始图像矩阵)print(img)print(shape:,img.shape)flatimg.flatten()print(\nflatten 后的向量)print(flat)print(shape:,flat.shape)输出原始图像矩阵[[1100][1100][0022][0022]]shape:(4,4)flatten 后的向量[1100110000220022]shape:(16,)这个小实验至少能说明两件事图片确实可以被转成向量flatten 后数值一个都没少所以从“能不能输入模型”这个角度说答案是完全没问题的。但真正的问题不是“能不能 flatten”而是flatten 之后图像原本的结构还剩下多少3. 图像和普通表格数据真正的区别在哪里先看普通表格数据。假设你做一个分类任务输入特征是年龄身高收入是否已婚这类数据通常是“字段式”的。每一列是一个特征每一行是一个样本。这些特征当然也可能彼此有关但整体上更像一组并列字段。而图像不是这样。一张图像里的像素值虽然也是数字但它们不是随意摆放的而是天然处在一个二维网格中左右相邻的像素通常有关联上下相邻的像素通常也有关联一小块区域往往会组成边缘、角点、纹理或者局部形状这也是图像任务和普通表格任务的重要区别。任务本质上是在定义给定什么输入希望得到什么输出 。而一旦输入从普通字段变成图像模型设计思路也不能完全照搬原来的方式 。所以图像和表格数据最大的不同不在于“是不是数字”而在于表格数据更像特征集合图像数据更像一个有空间结构的整体4. flatten 到底丢掉了什么这里最容易混淆的一点是很多人看到 flatten 后会说“像素值不是都还在吗那到底丢了什么”这个问题问得很好。flatten 没有丢掉像素值本身原来有多少个像素flatten 后还是多少个。数值没有消失数据量也没有凭空变少。flatten 弱化的是空间结构问题不在“数值没了”而在“组织方式变了”。原来图像是二维结构有左边、右边有上面、下面有邻接关系有局部区域flatten 之后这些信息不再以原来的形式出现。模型看到的是一长串数字而不是一张“有空间布局的图”。这就是为什么说flatten 丢掉的不是像素值本身而是这些像素之间原本的空间组织方式。5. 再用一段代码看清楚二维结构和一维向量的区别下面再来看一段更直观的代码importnumpyasnp imgnp.arange(1,10).reshape(3,3)print(原始矩阵)print(img)flatimg.flatten()print(\nflatten 后)print(flat)print(\n二维中 (0,0) 右边的像素是,img[0,1])print(二维中 (0,0) 下方的像素是,img[1,0])print(flatten 后索引 0 附近的数据,flat[0:4])输出原始矩阵[[123][456][789]]flatten 后[123456789]二维中(0,0)右边的像素是2二维中(0,0)下方的像素是4flatten 后索引0附近的数据[1234]在二维图像里(0,0)右边是谁很明确(0,0)下边是谁也很明确但 flatten 后模型直接面对的是一维顺序。它当然还能看到这些数字但“右边”和“下边”这种空间关系已经不再以图像本来的形式存在了。这也是为什么图像虽然能表示成数字但这些数字之间有空间关系、局部结构和形状模式不能简单当成普通向量来理解 。6. 为什么空间结构这么重要因为图像任务里很多真正有用的信息恰恰就藏在局部区域里。比如一张手写数字图片人能认出它是 3、5 还是 8不是因为你记住了每个像素编号而是因为你看到了某些区域有弯曲的边缘某些位置形成了封闭结构某些笔画之间有特定连接关系机器当然不是像人一样理解图像但它如果想学会分类也必须学会利用这些像素模式 。而这些模式通常不是靠某一个单独像素决定的而是由一小片区域共同决定的。比如一条边缘需要多个相邻像素共同形成一个角点需要局部区域一起判断一段笔画也不可能只靠一个像素识别出来所以图像中的关键信息很多都不是“某个值是多少”而是一小块区域里的像素是怎样组织起来的。这就是为什么图像不能被简单看成一长串普通数字。7. 如果想更直观一点还可以把二维图像画出来如果你希望把这件事看得更直观可以直接把刚才的小矩阵可视化一下importnumpyasnpimportmatplotlib.pyplotasplt imgnp.array([[1,1,0,0],[1,1,0,0],[0,0,2,2],[0,0,2,2]])plt.imshow(img,cmapgray)plt.title(Original 2D Image)plt.colorbar()plt.show()这段代码的意义不在于复杂而在于提醒我们图像首先是一个二维结构。你看到的不只是一些数字而是一个带空间布局的局部模式。这恰恰是图像和普通表格数据非常不一样的地方 。8. 全连接网络不是不能处理图像而是不够自然说到这里有人可能会问那是不是全连接网络完全不能做图像任务也不是。把图片 flatten 后送进全连接网络这种做法当然是可以训练的。在一些简单任务上它甚至也能得到结果。问题不在于“能不能做”而在于“这种做法是不是顺着图像结构来的”。很多时候模型效果不够好不只是因为参数不够而是因为模型本身的表达方式不够适合这个问题 。即使参数增加了只要模型本质上仍然是线性的它的表达能力边界依然存在 。而多层网络的关键也不只是“更大”而是能形成中间表示和更复杂的组合关系 。对应到图像任务上也是一样不是说模型能吃进一串像素值就够了更重要的是模型有没有真正利用图像中的空间关系和局部模式全连接层更像是在面对“一长串数字”而不是“一张有空间结构的图”。所以它不是完全不能处理图像而是不够自然也不够贴合图像这种输入形式。9. 真正该问的问题是什么到这里其实可以把这篇文章压缩成一句话图片当然可以表示成数字也可以展平成向量输入模型但图像不是普通无结构特征它包含空间关系、局部结构和形状模式直接 flatten 虽然保留了数值却弱化了这些结构在输入中的自然表达 。所以图像任务真正该问的问题不是图片能不能输入模型而是模型有没有真正利用图像的结构这也是卷积网络出现的核心动机。因为卷积并不是凭空发明出来的“更高级层”它首先是在回答一个非常具体的问题既然图像有空间结构网络能不能也按图像的特点来设计这就是下一篇要讲的内容。小结这篇文章主要讲清楚了三件事图片当然可以变成数字输入模型机器处理图像本质上是在处理一组数值并通过训练学习这些像素模式和类别之间的映射关系 。图像和普通表格数据不一样图像里的数字不是孤立排列的它们有空间关系、局部结构和形状模式 。直接 flatten 不是不行而是不够自然它保留了像素值但弱化了二维结构在输入中的自然表达因此不一定是最适合图像的处理方式 。

更多文章