用于图像分类的CNN Python代码

2025 年 1 月 5 日 | 阅读 21 分钟

我们来分解卷积神经网络(CNN)在图像分类中的组成部分,而不提供具体代码。一个典型的图像分类 CNN 由以下元素组成:

  1. 输入层
    • 输入层接收输入图像的原始像素值。该层的大小由输入图像的尺寸(例如,高度、宽度和颜色通道数)决定。
  2. 卷积层
    • 卷积层是 CNN 的核心构建块。它们包含滑过输入图像的滤波器(也称为卷积核),执行卷积操作。这有助于网络学习特征的空间层次结构。
    • 滤波器的数量和大小可变。随着网络深度的增加,滤波器数量可能会增加以捕获更复杂的模式。
  3. 激活函数
    • 激活函数(例如,ReLU - Rectified Linear Unit)在卷积操作后应用。它们为网络引入非线性,使其能够学习更复杂的模式。
  4. 池化层
    • 池化层(例如,MaxPooling)用于下采样特征图的空间尺寸,同时保留重要信息。这会降低网络的计算复杂度和参数数量。
  5. 展平层
    • 在几个卷积层和池化层之后,特征图的空间尺寸被展平成一维向量。这为全连接层输入数据做好了准备。
  6. 全连接层
    • 全连接层将一层中的每个神经元连接到下一层中的每个神经元。这些层对卷积层提取的特征执行高级推理。最终的全连接层通常使用 softmax 等激活函数输出类概率。
  7. 输出层
    • 输出层产生最终预测。对于图像分类,它通常具有与类别数量相同的神经元,并且常用 softmax 激活函数将原始分数转换为类概率。
  8. 损失函数
    • 损失函数衡量预测类概率与实际标签之间的差异。分类任务的常用损失函数包括分类交叉熵。
  9. 优化器
    • 优化器在训练期间调整网络的权重以最小化损失。常用优化器包括 Adam、SGD(随机梯度下降)和 RMSprop。
  10. 训练
    • CNN 在标记数据集上进行训练,模型从中学习将输入图像映射到其对应的标签。训练包括通过网络进行前向和后向传递,调整权重以最小化损失。
  11. 求值
    • 在单独的测试数据集上评估训练好的模型,以评估其在未见过的数据上的性能。准确性、精确率、召回率和 F1 分数等指标通常用于评估。
  12. Dropout
    • Dropout 是一种常用于 CNN 的正则化技术。它在训练期间随机丢弃一部分神经元以防止过拟合。这有助于网络更好地泛化到未见过的数据。
  13. Batch Normalization
    • Batch Normalization 是一种归一化每一层输入的技巧,有助于加快训练速度并提高泛化能力。它可以应用于卷积层和全连接层的输出。
  14. 迁移学习
    • 迁移学习涉及使用在大数据集(例如 ImageNet)上预先训练好的模型,并针对特定任务进行微调。当你的特定问题数据集较小时,这尤其有用。
  15. 数据增强
    • 数据增强包括对训练数据应用随机变换,例如旋转、缩放和翻转。这有助于增加训练数据集的多样性并提高模型的泛化能力。
  16. 学习率调度
    • 学习率调度在训练期间调整学习率。它可以用于加快收敛速度或防止对最佳权值过拟合。技术包括步长衰减、指数衰减或 Adam 等自适应方法。
  17. 超参数调整
    • CNN 有许多超参数,例如层数、滤波器大小和学习率。尝试不同的超参数组合可能会显著影响模型的性能。
  18. 类别不平衡
    • 如果你的数据集存在类别不平衡(某些类别的样本数显著少于其他类别),在训练期间考虑使用类别加权或过采样等技术来解决此问题。
  19. 模型可解释性
    • 由于其复杂性,理解 CNN 如何做出预测可能具有挑战性。Grad-CAM(梯度加权类激活映射)等技术可以帮助可视化图像的哪些部分对于网络的决策很重要。
  20. 集成学习
    • 集成学习涉及组合多个模型的预测以提高整体性能。训练具有不同初始化或架构的多个 CNN 并平均它们的预测可以带来更好的结果。
  21. 硬件加速
    • 训练大型 CNN 可能计算量很大。考虑使用 GPU 或 TPU 等硬件加速器来加快训练速度。
  22. 模型部署
    • 训练完成后,CNN 可以部署到新的、未见过的数据上进行预测。部署涉及将训练好的模型转换为适合目标环境的格式,例如 TensorFlow Serving、ONNX 或适用于移动设备的 TensorFlow Lite。

CNN 的架构和参数可以根据你数据集的特定特征和分类任务的要求进行定制。调整可能包括添加更多层、更改滤波器大小或使用不同的正则化技术。

使用 Python 构建用于图像分类的卷积神经网络 (CNN) 通常涉及使用 TensorFlow 或 PyTorch 等深度学习库。以下是一个使用 TensorFlow 和 Keras 进行图像分类的示例代码:

Python

输出

Epoch 1/5
938/938 [==============================] - 38s 40ms/step - loss: 0.1563 - accuracy: 0.9525 - val_loss: 0.0452 - val_accuracy: 0.9853
Epoch 2/5
938/938 [==============================] - 37s 39ms/step - loss: 0.0443 - accuracy: 0.9863 - val_loss: 0.0311 - val_accuracy: 0.9897
Epoch 3/5
938/938 [==============================] - 37s 39ms/step - loss: 0.0312 - accuracy: 0.9900 - val_loss: 0.0313 - val_accuracy: 0.9899
Epoch 4/5
938/938 [==============================] - 36s 38ms/step - loss: 0.0242 - accuracy: 0.9922 - val_loss: 0.0294 - val_accuracy: 0.9909
Epoch 5/5
938/938 [==============================] - 36s 38ms/step - loss: 0.0194 - accuracy: 0.9938 - val_loss: 0.0283 - val_accuracy: 0.9912
313/313 [==============================] - 2s 6ms/step - loss: 0.0283 - accuracy: 0.9912
Test accuracy: 0.9911999702453613

此示例使用了 MNIST 数据集,该数据集包含手写数字。你可以通过相应地修改数据加载和预处理步骤来替换为你自己的数据集。

在运行代码之前,请确保已安装 TensorFlow。你可以使用以下命令进行安装:

根据你具体的图像分类任务调整架构、超参数和数据集。

以下是使用 CIFAR-10 数据集的示例,该数据集包含 10 个不同类别的 60,000 张 32x32 颜色图像:

Python

输出

Epoch 1/10
782/782 [==============================] - 35s 45ms/step - loss: 1.5414 - accuracy: 0.4386 - val_loss: 1.2319 - val_accuracy: 0.5620
Epoch 2/10
782/782 [==============================] - 35s 45ms/step - loss: 1.1730 - accuracy: 0.5821 - val_loss: 1.0828 - val_accuracy: 0.6142
Epoch 3/10
782/782 [==============================] - 35s 45ms/step - loss: 1.0163 - accuracy: 0.6414 - val_loss: 1.0004 - val_accuracy: 0.6461
Epoch 4/10
782/782 [==============================] - 35s 45ms/step - loss: 0.9174 - accuracy: 0.6759 - val_loss: 0.9413 - val_accuracy: 0.6674
Epoch 5/10
782/782 [==============================] - 35s 45ms/step - loss: 0.8532 - accuracy: 0.6993 - val_loss: 0.9089 - val_accuracy: 0.6812
Epoch 6/10
782/782 [==============================] - 35s 45ms/step - loss: 0.8001 - accuracy: 0.7197 - val_loss: 0.8763 - val_accuracy: 0.6971
Epoch 7/10
782/782 [==============================] - 35s 45ms/step - loss: 0.7575 - accuracy: 0.7354 - val_loss: 0.8899 - val_accuracy: 0.6944
Epoch 8/10
782/782 [==============================] - 35s 45ms/step - loss: 0.7224 - accuracy: 0.7466 - val_loss: 0.8625 - val_accuracy: 0.7025
Epoch 9/10
782/782 [==============================] - 35s 45ms/step - loss: 0.6887 - accuracy: 0.7577 - val_loss: 0.8488 - val_accuracy: 0.7091
Epoch 10/10
782/782 [==============================] - 35s 45ms/step - loss: 0.6606 - accuracy: 0.7672 - val_loss: 0.8561 - val_accuracy: 0.7077
313/313 [==============================] - 2s 7ms/step - loss: 0.8561 - accuracy: 0.7077
Test accuracy: 0.7076999549865723

在此示例中,模型是 CNN 的简化版本。你可能需要根据你具体的图像分类问题调整架构和超参数。

如果你还没有安装 TensorFlow,请确保安装它,使用:

请随意用你自己的数据集替换 CIFAR-10 数据集并相应地调整模型架构。构建用于图像分类的 CNN 的原理保持不变。

以下是使用 Fashion MNIST 数据集的示例,该数据集包含 10 个时尚类别的 28x28 灰度图像:

Python

输出

Epoch 1/5
938/938 [==============================] - 38s 40ms/step - loss: 0.5445 - accuracy: 0.8035 - val_loss: 0.4086 - val_accuracy: 0.8546
Epoch 2/5
938/938 [==============================] - 36s 39ms/step - loss: 0.3484 - accuracy: 0.8746 - val_loss: 0.3312 - val_accuracy: 0.8786
Epoch 3/5
938/938 [==============================] - 36s 39ms/step - loss: 0.2998 - accuracy: 0.8900 - val_loss: 0.3006 - val_accuracy: 0.8930
Epoch 4/5
938/938 [==============================] - 37s 39ms/step - loss: 0.2705 - accuracy: 0.9004 - val_loss: 0.2943 - val_accuracy: 0.8934
Epoch 5/5
938/938 [==============================] - 36s 38ms/step - loss: 0.2473 - accuracy: 0.9096 - val_loss: 0.2964 - val_accuracy: 0.8928
313/313 [==============================] - 2s 6ms/step - loss: 0.2964 - accuracy: 0.8928
Test accuracy: 0.892799973487854

此示例遵循与之前的示例类似的结构,但使用了 Fashion MNIST 数据集。一如既往,请根据你具体的数据集和问题调整代码,相应地调整模型架构、超参数和训练参数。

确保如果还没有安装 TensorFlow,请安装它:

请根据你具体的图像分类任务自由尝试不同的数据集和模型架构。

让我们考虑一个使用“猫狗”数据集的示例,这是一个二分类问题,目标是将图像分类为包含猫或狗。以下是使用 TensorFlow 和 Keras 的简单示例:

Python

输出

Found 2000 images belonging to 2 classes.
Found 1000 images belonging to 2 classes.
Epoch 1/10
63/63 [==============================] - 52s 817ms/step - loss: 0.7171 - accuracy: 0.5073 - val_loss: 0.6906 - val_accuracy: 0.5180
Epoch 2/10
63/63 [==============================] - 49s 781ms/step - loss: 0.6812 - accuracy: 0.5618 - val_loss: 0.6433 - val_accuracy: 0.6220
Epoch 3/10
63/63 [==============================] - 49s 785ms/step - loss: 0.6523 - accuracy: 0.6190 - val_loss: 0.6454 - val_accuracy: 0.6180
Epoch 4/10
63/63 [==============================] - 49s 779ms/step - loss: 0.6143 - accuracy: 0.6633 - val_loss: 0.5737 - val_accuracy: 0.7140
Epoch 5/10
63/63 [==============================] - 49s 783ms/step - loss: 0.5689 - accuracy: 0.7053 - val_loss: 0.5684 - val_accuracy: 0.6990
Epoch 6/10
63/63 [==============================] - 50s 791ms/step - loss: 0.5259 - accuracy: 0.7315 - val_loss: 0.5485 - val_accuracy: 0.7140
Epoch 7/10
63/63 [==============================] - 50s 793ms/step - loss: 0.4822 - accuracy: 0.7748 - val_loss: 0.4939 - val_accuracy: 0.7680
Epoch 8/10
63/63 [==============================] - 50s 791ms/step - loss: 0.4506 - accuracy: 0.7930 - val_loss: 0.5263 - val_accuracy: 0.7460
Epoch 9/10
63/63 [==============================] - 50s 790ms/step - loss: 0.4105 - accuracy: 0.8160 - val_loss: 0.4874 - val_accuracy: 0.7640
Epoch 10/10
63/63 [==============================] - 49s 784ms/step - loss: 0.3713 - accuracy: 0.8393 - val_loss: 0.5115 - val_accuracy: 0.7680
32/32 [==============================] - 10s 301ms/step - loss: 0.5115 - accuracy: 0.7680
Test accuracy: 0.7680000066757202

确保将 'path/to/train' 和 'path/to/test' 替换为你的训练和测试数据集的实际路径。此示例使用 Keras 的 `ImageDataGenerator` 进行数据增强,这有助于防止过拟合。

如果你还没有安装 TensorFlow,请安装它:

请随意根据你具体的图像分类任务和数据集自定义模型架构和超参数。

以下是使用 TensorFlow 和 Keras API 对自定义数据集进行图像分类的示例。此示例假定你的数据集已组织到文件夹中,每个文件夹代表不同的类别。

Python

输出

Found 2000 images belonging to 2 classes.
Found 1000 images belonging to 2 classes.
Epoch 1/10
63/63 [==============================] - 42s 650ms/step - loss: 0.7143 - accuracy: 0.5025 - val_loss: 0.6872 - val_accuracy: 0.5050
Epoch 2/10
63/63 [==============================] - 41s 651ms/step - loss: 0.6847 - accuracy: 0.5485 - val_loss: 0.6806 - val_accuracy: 0.5700
Epoch 3/10
63/63 [==============================] - 41s 651ms/step - loss: 0.6768 - accuracy: 0.5730 - val_loss: 0.6511 - val_accuracy: 0.6210
Epoch 4/10
63/63 [==============================] - 41s 650ms/step - loss: 0.6631 - accuracy: 0.5970 - val_loss: 0.6687 - val_accuracy: 0.5870
Epoch 5/10
63/63 [==============================] - 41s 650ms/step - loss: 0.6504 - accuracy: 0.6240 - val_loss: 0.6393 - val_accuracy: 0.6340
Epoch 6/10
63/63 [==============================] - 41s 651ms/step - loss: 0.6320 - accuracy: 0.6405 - val_loss: 0.6304 - val_accuracy: 0.6430
Epoch 7/10
63/63 [==============================] - 41s 650ms/step - loss: 0.6182 - accuracy: 0.6525 - val_loss: 0.6234 - val_accuracy: 0.6530
Epoch 8/10
63/63 [==============================] - 41s 651ms/step - loss: 0.6151 - accuracy: 0.6590 - val_loss: 0.6115 - val_accuracy: 0.6640
Epoch 9/10
63/63 [==============================] - 41s 651ms/step - loss: 0.6011 - accuracy: 0.6775 - val_loss: 0.6104 - val_accuracy: 0.6700
Epoch 10/10
63/63 [==============================] - 41s 651ms/step - loss: 0.5824 - accuracy: 0.6890 - val_loss: 0.6045 - val_accuracy: 0.6680
32/32 [==============================] - 5s 162ms/step - loss: 0.6045 - accuracy: 0.6680
Test accuracy: 0.6680000429153442

请确保将 'path/to/train' 和 'path/to/test' 替换为你的训练和测试数据集的实际路径。根据你具体的图像分类任务和数据集调整模型架构、超参数和数据预处理。

这是一个基本示例,根据你的数据集和任务,你可能需要考虑使用更高级的架构、微调预训练模型或尝试不同的数据增强技术。

让我们探索一个使用更高级架构和迁移学习以及流行的 MobileNetV2 模型的示例。我们将使用 TensorFlow 和 Keras API 以及 ImageDataGenerator 来实现高效的数据加载和增强。

Python

输出

Test accuracy: [accuracy_value]

确保将 'path/to/train' 和 'path/to/test' 替换为你的训练和测试数据集的实际路径。此示例使用 MobileNetV2 作为基础模型,它已经在 ImageNet 上进行了预训练。通过在顶部添加几个层,你可以微调模型以适应你的特定分类任务。

请随意尝试不同的预训练模型(例如,ResNet、InceptionV3)并根据你的数据集和要求调整超参数。

让我们考虑一个使用 TensorFlow 和 Keras API 对自定义数据集进行图像分类的示例,并使用 EfficientNetB0 模型进行迁移学习。EfficientNet 模型以其效率和有效性而闻名。这是一个示例:

Python

输出

Test accuracy: [accuracy_value]

请确保将 'path/to/train' 和 'path/to/test' 替换为你的训练和测试数据集的实际路径。此示例使用 EfficientNetB0 作为基础模型,它已经在 ImageNet 上进行了预训练。根据你具体的图像分类任务和数据集调整模型架构、超参数和数据预处理。

请根据你的需求自由尝试不同的 EfficientNet 变体或其他预训练模型。

让我们探索一个使用 TensorFlow 和 Keras API 对自定义数据集进行图像分类的示例,并使用不同的架构(例如 InceptionV3 模型)进行迁移学习。这是一个示例:

Python

输出

Test accuracy: [accuracy_value]

请确保将 'path/to/train' 和 'path/to/test' 替换为你的训练和测试数据集的实际路径。此示例使用 InceptionV3 作为基础模型,它已经在 ImageNet 上进行了预训练。根据你具体的图像分类任务和数据集调整模型架构、超参数和数据预处理。

请根据你的需求自由尝试不同的预训练模型并调整参数。

让我们探索一个使用 TensorFlow 和 Keras API 对自定义数据集进行图像分类的示例,并使用 Xception 模型进行迁移学习。Xception 是另一个强大的卷积神经网络架构。这是一个示例:

Python

输出

Test accuracy: [accuracy_value]

请确保将 'path/to/train' 和 'path/to/test' 替换为你的训练和测试数据集的实际路径。此示例使用 Xception 作为基础模型,它已经在 ImageNet 上进行了预训练。根据你具体的图像分类任务和数据集调整模型架构、超参数和数据预处理。

请根据你的需求自由尝试不同的预训练模型并调整参数。

让我们探索一个使用 TensorFlow 和 Keras API 对自定义数据集进行图像分类的示例,并使用 VGG16 模型进行迁移学习。VGG16 是一个广泛使用的卷积神经网络架构。这是一个示例:

Python

输出

Test accuracy: [accuracy_value]

请确保将 'path/to/train' 和 'path/to/test' 替换为你的训练和测试数据集的实际路径。此示例使用 VGG16 作为基础模型,它已经在 ImageNet 上进行了预训练。根据你具体的图像分类任务和数据集调整模型架构、超参数和数据预处理。

请根据你的需求自由尝试不同的预训练模型并调整参数。

让我们探索一个使用 TensorFlow 和 Keras API 对自定义数据集进行图像分类的示例,并使用 ResNet50 模型进行迁移学习。ResNet50 是一个深度卷积神经网络架构,在图像分类任务中以其有效性而闻名。这是一个示例:

Python

输出

Test accuracy: [accuracy_value]

请确保将 'path/to/train' 和 'path/to/test' 替换为你的训练和测试数据集的实际路径。此示例使用 ResNet50 作为基础模型,它已经在 ImageNet 上进行了预训练。根据你具体的图像分类任务和数据集调整模型架构、超参数和数据预处理。

请根据你的需求自由尝试不同的预训练模型并调整参数。

以下是使用 TensorFlow 和 Keras API 对自定义数据集进行图像分类的示例,并使用 DenseNet121 模型进行迁移学习。DenseNet 以其密集连接模式而闻名,可以有效地重用特征。这是一个示例:

Python

输出

Test accuracy: [accuracy_value]

请确保将 'path/to/train' 和 'path/to/test' 替换为你的训练和测试数据集的实际路径。此示例使用 DenseNet121 作为基础模型,它已经在 ImageNet 上进行了预训练。根据你具体的图像分类任务和数据集调整模型架构、超参数和数据预处理。

请根据你的需求自由尝试不同的预训练模型并调整参数。

让我们探索一个使用 TensorFlow 和 Keras API 对自定义数据集进行图像分类的示例,并使用 NASNetMobile 模型进行迁移学习。NASNetMobile 以其用于高效模型设计的神经架构搜索而闻名。这是一个示例:

Python

输出

Test accuracy: [accuracy_value]

请确保将 'path/to/train' 和 'path/to/test' 替换为你的训练和测试数据集的实际路径。此示例使用 NASNetMobile 作为基础模型,它已经在 ImageNet 上进行了预训练。根据你具体的图像分类任务和数据集调整模型架构、超参数和数据预处理。

请根据你的需求自由尝试不同的预训练模型并调整参数。

以下是使用 TensorFlow 和 Keras API 对自定义数据集进行图像分类的示例,并使用 MobileNetV2 模型进行迁移学习。MobileNetV2 专为移动和边缘设备设计,在准确性和效率之间取得了良好的平衡。这是一个示例:

Python

输出

Test accuracy: [accuracy_value]

请确保将 'path/to/train' 和 'path/to/test' 替换为你的训练和测试数据集的实际路径。此示例使用 MobileNetV2 作为基础模型,它已经在 ImageNet 上进行了预训练。根据你具体的图像分类任务和数据集调整模型架构、超参数和数据预处理。

请根据你的需求自由尝试不同的预训练模型并调整参数。