- 先决条件:
- 图像分类
- 卷积神经网络,包括基本池化、神经网络中具有归一化的卷积层和 dropout。
- 数据增强。
- 神经网络。
- Numpy 数组。
在本文中,我们将讨论如何使用 TensorFlow 对图像进行分类。 图像分类是一种将图像分类为其各自类别类的方法。CIFAR-10 数据集,正如它所暗示的那样,其中包含 10 种不同类别的图像。共有 60000 张图像,分为 10 个不同的类别,分别命名为飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车。所有图像的大小均为 32×32。总共有 50000 张 train 图像和 10000 张测试图像。
为了构建图像分类器,我们使用 tensorflow 的 keras API 来构建我们的模型。为了构建模型,建议支持 GPU,或者您也可以使用 Google colab 笔记本。
逐步实施:
- 编写任何代码的第一步是导入所有需要的库和模块。这包括导入 tensorflow 和其他模块,如 numpy。如果该模块不存在,那么您可以在 命令提示符(适用于 Windows)上使用 pip install tensorflow 下载它,或者如果您使用的是 jupyter 笔记本,则只需在单元格中键入 !pip install tensorflow 并运行它即可下载该模块。其他模块也可以类似地导入。
import tensorflow as tf # Display the version print(tf.__version__) # other imports import numpy as np import matplotlib.pyplot as plt from tensorflow.keras.layers import Input, Conv2D, Dense, Flatten, Dropout from tensorflow.keras.layers import GlobalMaxPooling2D, MaxPooling2D from tensorflow.keras.layers import BatchNormalization from tensorflow.keras.models import Model
输出:
2.4.1
上述代码的输出应显示您正在使用的 tensorflow 版本,例如 2.4.1 或任何其他版本。
-
现在我们有了所需的模块支持,所以让我们加载我们的数据。CIFAR-10 的数据集可以在 tensorflow keras API 上找到,我们可以使用 tensorflow.keras.datasets.cifar10 在本地机器上下载它,然后使用 load_data() 函数将其分发到训练和测试集。
# Load in the data cifar10 = tf.keras.datasets.cifar10 # Distribute it to train and test set (x_train, y_train), (x_test, y_test) = cifar10.load_data() print(x_train.shape, y_train.shape, x_test.shape, y_test.shape)
输出:
上述代码的输出将显示所有四个分区的形状,如下所示
在这里,我们可以看到我们有 5000 张训练图像和 1000 张测试图像,如上所述,所有图像的大小都是 32 x 32 的大小,并且有 3 个颜色通道,即图像是彩色图像。此外,还可以看到每个图像只分配了一个标签。
- 到目前为止,我们随身携带着我们的数据。但是,我们仍然无法将其直接发送到我们的神经网络。我们需要处理数据才能将其发送到网络。该过程的第一件事是减少像素值。目前,所有图像像素都在 1-256 的范围内,我们需要将这些值减少到 0 到 1 之间的值。这使我们的模型能够轻松跟踪趋势和高效训练。我们只需将所有像素值除以 255.0 即可完成此作。
我们要做的另一件事是使用 flatten() 函数展平(简单地说,以行的形式重新排列它们)标签值。
# Reduce pixel values x_train, x_test = x_train / 255.0, x_test / 255.0 # flatten the label values y_train, y_test = y_train.flatten(), y_test.flatten()
- 现在是查看我们数据集的几张图片的好时机。我们可以以子图网格形式可视化它。由于图像大小仅为 32×32,因此不要对图像抱有太大期望。那会是个模糊的。我们可以使用 matplotlib 中的 subplot() 函数进行可视化,并循环访问训练数据集部分的前 25 张图像。
# visualize data by plotting images fig, ax = plt.subplots(5, 5) k = 0 for i in range(5): for j in range(5): ax[i][j].imshow(x_train[k], aspect='auto') k += 1 plt.show()
输出:
虽然图像不清晰,但有足够的像素供我们指定这些图像中存在哪个对象。
- 完成所有步骤后,现在是构建模型的时候了。我们将使用卷积神经网络或 CNN 来训练我们的模型。它包括在此中使用卷积层,即 Conv2d 层以及池化和归一化方法。最后,我们将它传递到一个 dense 层和最后一个 dense 层,即我们的输出层。我们正在使用 'relu' 激活函数。输出层使用 “softmax” 函数。
# number of classes K = len(set(y_train)) # calculate total number of classes # for output layer print("number of classes:", K) # Build the model using the functional API # input layer i = Input(shape=x_train[0].shape) x = Conv2D(32, (3, 3), activation='relu', padding='same')(i) x = BatchNormalization()(x) x = Conv2D(32, (3, 3), activation='relu', padding='same')(x) x = BatchNormalization()(x) x = MaxPooling2D((2, 2))(x) x = Conv2D(64, (3, 3), activation='relu', padding='same')(x) x = BatchNormalization()(x) x = Conv2D(64, (3, 3), activation='relu', padding='same')(x) x = BatchNormalization()(x) x = MaxPooling2D((2, 2))(x) x = Conv2D(128, (3, 3), activation='relu', padding='same')(x) x = BatchNormalization()(x) x = Conv2D(128, (3, 3), activation='relu', padding='same')(x) x = BatchNormalization()(x) x = MaxPooling2D((2, 2))(x) x = Flatten()(x) x = Dropout(0.2)(x) # Hidden layer x = Dense(1024, activation='relu')(x) x = Dropout(0.2)(x) # last hidden layer i.e.. output layer x = Dense(K, activation='softmax')(x) model = Model(i, x) # model description model.summary()
输出: