图像识别(也称图像分类)的核心目标,是让计算机能够“看懂”图片中的内容。TensorFlow 与 Keras 是目前实现这一目标最常用的工具组合。本文将通过清晰的步骤,带你深入了解如何借助 Keras 完成图像识别任务。
关键术语解析
在正式动手实践之前,有必要先厘清几个核心概念。如果对这些基础术语缺乏清晰认知,后续内容的理解难度会明显增加。
TensorFlow / Keras
TensorFlow 是由 Google Brain 团队开发的开源 Python 库,集成了大量算法和预训练模型,可用于搭建深度神经网络,处理图像识别、自然语言处理等任务。它的工作机制是将一系列数学运算作为节点连接成“计算图”,并在图中传递数据。Keras 则是一个更高级的 API(应用程序编程接口),它将 TensorFlow(以及 Theano 等其他机器学习库)的功能封装得更加简洁易用,主打用户友好与模块化。简单来说,借助 Keras 可以极大简化 TensorFlow 的强大能力,在 Python 中几乎无需额外配置即可快速上手。
图像识别(分类)
图像识别的基本流程是:向神经网络输入一张图片,网络输出一个标签,指明该图片属于哪个预定义的类别。如果一张图片只能对应一个标签,通常称为“识别”;如果一张图片可以同时属于多个类别,则称为“分类”。
对象检测是图像分类的一个子领域,它需要在图片中定位并框出具体的物体(如动物、车辆、人物),并标注其位置。
特征提取
要实现识别或分类,神经网络必须学会从图片中提取“特征”。这些特征是代表图像信息的数据元素。在图像识别中,特征通常是一组像素,例如边缘、角点等。网络通过分析这些特征来识别模式。
特征提取,就是从输入图像中抽取出这些有价值的信息。许多图片本身带有注释和元数据,这能帮助神经网络更高效地聚焦关键信息。
神经网络如何学习识别图像
大致理解神经网络识别图像的过程,对你后续实现模型将有极大帮助。下面我们将简要拆解这一机制。
使用滤波器进行特征提取

神经网络的第一层会接收一幅图像的所有像素。当所有数据进入网络后,不同的滤波器会像扫描一样“滑过”图像,提取出图像各个区域的特征。这就是特征提取的过程,生成的结果称为“特征映射”。
这个提取过程由“卷积层”完成。卷积的本质是形成图像的局部表示。卷积神经网络(CNN)这一术语由此而来,它也是图像分类和识别中最常用的神经网络架构。
如果你仍对特征映射的生成方式感到困惑,可以想象一个场景:在一个黑暗的房间里,你用手电筒的光束扫过一幅画。当光束移动时,你只能看到被照亮的那一小部分,这个过程就是在学习画面的局部特征。在这个比喻中,手电筒的光束就是滤波器,网络用它来形成图像的各种表示。
光束的宽度决定了你一次能观察到的区域大小。神经网络中也有类似参数,即“滤波器大小”。它决定了每次扫描覆盖多少个像素。CNN 中常见的滤波器大小是 3×3。

滤波器的尺寸除了高度和宽度,还包含一个“深度”维度。
2D 图像如何具有深度?
数字图像在渲染时由高度、宽度以及像素的 RGB 值定义。因此这里的“深度”指的是图像的颜色通道数量。灰度图只有 1 个颜色通道,而彩色图有 3 个。
这意味着,如果一个 3×3 的滤波器应用于彩色图像,其实际规模为 3×3×3。对于滤波器覆盖的每个像素,神经网络会将滤波器的值与像素本身的值相乘,得到一个数值表示。然后,滤波器按照“步幅”这个参数在整张图像上滑动,完成所有区域的表示。CNN 的默认步幅通常为 2。
完成上述计算后,我们就得到了特征映射。这个过程通常由多个滤波器并行进行,以确保提取到的特征足够丰富且复杂。
激活函数
特征映射生成后,代表图像的数值会通过一个激活函数层。卷积层产生的数据是线性的,但图像本身高度非线性,因此激活函数的作用是引入非线性特征,增强网络的表达能力。
最常用的激活函数是线性整流函数(ReLU),虽然偶尔也会使用其他函数,但 ReLU 基本是标配。
池化层
数据经过激活后,会被送入池化层。池化的作用是对图像进行下采样,即“压缩”图像信息,使其尺寸变小。这样做能让网络更灵活,更擅长识别对象的核心特征。
想象一下,你看一幅照片时,通常不会纠结于背景里的每根草,而是会聚焦于你关心的人或物。CNN 的池化层也类似,它会帮你抽掉图像中不重要的部分,只保留最相关的信息。压缩的力度由池化层指定的大小决定。
因为池化层需要判断图像中哪部分最核心,所以它会迫使网络只学习真正能代表目标物体的特征。这有助于防止过拟合——即网络对训练样本记得过牢,从而无法泛化到未见过的数据。

池化方法有多种,最常用的是最大池化(max pooling)。它的做法很简单:在滤波器覆盖的区域中,只取像素值最大的那一个。例如使用 2×2 的滤波器,意味着会丢弃 75% 的信息。
取最大值的好处是,可以在一定程度上容忍图像的轻微形变,同时减少参数和尺寸,有效控制过拟合。其他方法如均值池化(average pooling)和求和池化(sum pooling)偶尔也会使用,但由于最大池化的准确率通常更高,它占据了绝对主流地位。
压平(Flattening)
CNN 的最后几层是全连接层(稠密层),这种层处理的数据必须是向量形式。因此在数据进入全连接层之前,必须进行“压平”操作。简单来说,就是将多维的特征映射数据拉伸成一长列数值。
全连接层
CNN 的最后一层本质上是一个人工神经网络(ANN)。它的任务是分析输入的特征,并将其组合成有助于分类的不同属性。这些层由神经元集合组成,每个集合可能代表某个对象的局部特征,比如狗的松软耳朵、苹果的红色等。当足够多的神经元被输入图像激活时,网络就会判定该图像属于某个类别。

全连接层会计算出网络给出的预测值与真实标签之间的误差。然后网络进行反向传播,计算每个神经元对下一层的影响程度,并据此调整参数。整个过程不断重复,目的是优化模型性能。这就是神经网络从数据中学习,并掌握输入特征与输出类别之间关联的方式。
中间层的神经元会输出二值信号(如 1 或 0),以表明图像是否具备某个类的特征。最终的全连接层则输出每个类别的概率,所有概率之和为 1。例如,若“狗”这个类别的概率为 0.75,表示网络有 75% 的把握认为该图是狗。至此,图像分类器训练完成,你可以将一张新图片传入 CNN,它会输出自己的预测结果。
机器学习的工作流程
在进入实操案例之前,我们还需要统一认识,了解机器学习项目标准的工作流程。训练神经网络模型的过程通常可分为四个阶段。
数据准备
第一步是收集数据,并将其整理成神经网络能够“消化”的格式。这意味着需要找到图片,并为每张图片打上正确的标签。即使下载别人已经整理好的数据集,也常常需要预处理才能用于训练。数据准备本身是一门学问,经常需要处理缺失值、数据损坏、格式错误、标签不正确等问题。
创建模型
搭建神经网络模型涉及多种参数和超参数的选择。你需要决定层数、每层的输入输出尺寸、激活函数类型,以及是否添加 Dropout 来防止过拟合等。
训练模型
模型创建好后,进行实例化,然后将训练数据输入模型。训练时一个关键因素是时间。你可以通过设置 epoch(迭代轮数)来控制训练时长。一般来说,训练越久,模型表现可能越好。但 epoch 过多也存在风险,即过拟合——模型死记硬背训练数据,反而失去泛化能力。
实际训练时,可以设置一个合理的 epoch 数,并在训练过程中定期保存网络权重。这样即使中途中断,也能从最近的保存点继续,无需从头开始。
模型评估
评估模型包含多个步骤。首先,使用模型从未见过的验证数据集测试其性能。评估指标有很多,最常见的是“准确率”——即正确分类的图片数量除以图片总数。看到验证集上的准确率后,通常会发现效果不够理想,于是调整参数,再训练一轮。这个过程可能需要重复多次,直到结果满意为止。
最后一步,使用“测试集”来最终检验模型。这个测试集里的数据,模型在训练和调参过程中从未见过。
你可能会问:既然有验证集,为什么还要专门搞一个测试集?
答案是:所有参数调整和反复验证,已经让网络在不知不觉中“学会”了验证集的一些特征,导致它在验证集上表现不错,但无法推广到完全未知的数据上。测试集的目的,就是最后检验一次模型是否存在过拟合等问题,确保它真正具备实际应用的价值。
