使用深度AutoViML的多类图像分类器
图像分类将输入的图像归入各自的标签或类别。大多数图像分类通常只有两个类别,例如cat 和dog 。在多类中,我们有三个或更多的类别,例如lion 、cheetah 、leopard 和tiger 。
多类图像分类将输入的图像归入三个或更多类别中的一个。在进行多类分类时,预测的图像只属于一个类。一幅图像不能同时属于一个以上的类别。
我们将使用Deep AutoViML 库来建立模型。Deep AutoViML是一个自动机器学习(AutoML)库,使用TensorFlow和Keras构建神经网络。
在本教程中,我们将使用Deep AutoViML建立一个模型,对玩剪刀石头布游戏的手的图像进行分类。这些图片有三个类别。rock,paper 和scissors 。
前提条件
要继续学习本教程,读者应该。
- 理解[Python中的图像预处理]。
- 理解[卷积神经网络]。
- 知道如何使用[Keras]和[TensorFlow]建立一个图像分类器。
- 在[Google Colab笔记本]中运行该模型。
开始使用Deep AutoViML
Deep AutoViML将构建图像分类模型的过程自动化。Deep AutoViml使用Keras和Tensorflow库来构建一个深度学习模型。这些模型的速度很快,而且更准确。
Deep AutoViML还可以自动完成NLP任务。在本教程中,我们将专注于图像分类。Deep AutoViML有以下有用的功能。
Deep AutoViML的特点
- Deep AutoViML使用Keras预处理层来自动进行图像预处理--图像预处理是图像分类的一个重要阶段。它将图像转换为神经网络可以理解和使用的格式。
最常见的图像预处理活动如下。
- 图像归一化- 图像归一化将图像的像素强度值的范围转换为用户定义的范围。
- 图像大小调整- 图像大小调整是改变图像大小的过程。这使得调整后的图像能够适应你正在构建的神经网络。
- 图像标准化- 改变图像像素以满足所需的标准,使图像能有统一的高度和宽度。
- 图像缩放- 这个过程将图像转换为用户设定的比例。
这些过程非常重要,要详细了解这些过程,这些过程提供了一个随时可以使用的图像。
- Deep AutoViML使用预训练的模型 - 预训练的模型是使用大型数据集进行训练的神经网络模型。然后,这些模型被导入以解决类似的问题。
在本教程中,我们将使用预训练的MobileNet卷积神经网络,它用于图像分类。MobileNet是使用大型图像数据集训练的。这个模型已经被导入到Deep AutoViML中。
- Deep AutoViML执行超参数调整--超参数调整是对神经网络的参数进行微调的过程。找到最佳参数会产生一个优化的模型。Deep AutoViML使用Optuna来自动搜索最佳神经网络参数。
- Deep AutoViML允许你添加更多的自定义层--使用Deep AutoViML,我们可以向预训练的模型添加更多的层。这使我们能够拥有更多以用户为中心的模型,能够满足用户的需求。
- Deep AutoViML自动选择最佳模型。
- Deep AutoViML自动保存训练好的模型。
为了使用这个库,我们使用下面的命令来安装它。
!pip install deep_autoviml --upgrade
在安装过程中,我们现在可以使用下面的代码导入deep_autoviml 。
from deep_autoviml import deep_autoviml as deepauto
使用GPU
GPU比CPU快得多。由于我们要处理的是一个图像分类问题,我们要初始化GPU。我们还将监测其性能。
要使用谷歌Colab的GPU,请按照以下步骤进行。
- 点击
Runtime选项。

- 点击
Change runtime type。

- 然后选择
GPU选项并保存。

为了管理和监控这个GPU,我们将使用Nvidia-smi 。
!nvidia-smi
现在让我们使用deep_autoviml 和Nvidia-smi 来建立多类图像分类模型。首先,我们下载图像数据集。
图像数据集
该图像数据集有三个类别。rock,paper, 和scissors 。要获得手势数据集,请点击这里。
我们现在需要将该数据集添加到我们的工作目录中。为了将这个数据集下载到我们的工作目录中,我们使用下面的命令。
!wget --no-check-certificate \
https://www.kaggle.com/drgfreeman/rockpaperscissors.zip
该命令下载数据集并将数据集添加到工作目录中。该数据集将以zip 的格式出现。
解压缩数据集
要解压数据集,我们使用下面的命令。
!unzip rockpaperscissors.zip
在解压数据集之后,让我们创建一个train 和test 文件夹。train 文件夹将有训练集,test 文件夹将有测试集。
为了创建这些文件夹,我们使用下面的命令。
!mkdir rockpaperscissors/train
!mkdir rockpaperscissors/test
让我们用下面的代码把训练集移到这个文件夹里。
!mv rockpaperscissors/paper rockpaperscissors/train/paper
!mv rockpaperscissors/rock rockpaperscissors/train/rock
!mv rockpaperscissors/scissors rockpaperscissors/train/scissors
添加测试图像
为了将测试集的图像添加到test 文件夹中,我们使用下面的命令。
!mv rockpaperscissors/rps-cv-images rockpaperscissors/test
现在我们通过删除不必要的文件来清理这个目录。
清理目录
为了清理这个目录,我们使用下面的命令。
!rm rockpaperscissors/README_rpc-cv-images.txt
!rm rockpaperscissors/test/README_rpc-cv-images.txt
这个命令将从我们的目录中删除这两个文件。
显示图像
为了显示一些图片,我们使用IPython.display Python模块。要导入这个模块,我们使用下面的代码。
from IPython.display import Image, display
我们将显示一些图像,使用下面的代码。
display(Image('rockpaperscissors/train/scissors/KNNsNhduqSfuqEK5.png'))
输出结果显示如下。

上面的图片显示了一个scissors 的手势。
display(Image('rockpaperscissors/test/paper/9zuFLFklb0ibEelE.png'))

上面的图片显示了一个paper 的手势。
display(Image('rockpaperscissors/test/rock/JOaPrPIINVvoI9l4.png'))

上面的图片显示了一个rock 的手势。
导入库
我们导入重要的库,如下所示。
import matplotlib.pyplot as plt
import numpy as np
import warnings
warnings.filterwarnings('ignore')
导入的库有以下功能。
- matplotlib- Matplotlib是一个可视化库。我们使用Matplotlib来绘制图表和不同的图形。
- numpy- Numpy将输入的图像转换为数组。它对数组进行数学运算。
- warnings- 它显示运行我们的模型时出现的警告。在我们的案例中,我们已经决定忽略这些警告。
安装完这些库后,让我们指定数据集目录。
数据集目录
添加数据集目录将使模型能够知道数据集的位置。为了添加该目录,我们使用下面的代码。
image_dir = '/content/rockpaperscissors/'
接下来,让我们指定图像的大小和图像类的数量。
图像大小
我们指定图像的高度和宽度。要添加图像尺寸,使用下面的代码。
img_height = 224
img_width = 224
img_channels = 3
从上面的代码中,我们将图像高度设置为224,图像宽度设置为224。这是Deep AutoViML所期望的默认图像尺寸。Deep AutoViML内部使用预训练的MobileNet。
MobileNet 模型使用244×244像素的图像。img_channels = 3 代表图像类别的数量(石头、布、剪刀)。
接下来,让我们初始化神经网络。
初始化神经网络
我们使用下面的代码来初始化神经网络。
keras_model_type = "image"
keras_options = {"early_stopping": True, 'lr_scheduler': 'rlr', "epochs": 3}
model_options = {'tuner':"optuna", "max_trials":2, 'cat_feat_cross_flag':True,
'image_directory': image_dir, 'image_height': img_height,
'image_width':img_width, 'image_channels':img_channels }
从上面的代码片段来看,神经网络有以下参数。
- keras_model_type- Deep AutoViML使用Keras库模型来构建神经网络。由于我们正在建立一个图像分类模型,我们将模型的类型设置为
image分类器。这将自动使用MobileNet模型来训练神经网络。 - keras_options- 它改变了Keras模型的选项。Keras模型有一些选项,如
early_stopping,lr_scheduler,和epochs。
让我们来解释一下这些模型。
early_stopping- 早期停止是一个参数,用于避免模型在训练期间过度拟合。我们将其设置为 。Truelr_scheduler- 它用于确定神经网络在每个 epoch/迭代期间的速率。epochs- 决定了模型的总迭代次数。我们将迭代次数设置为 。3
- model_options- 它设置输入图像的关键属性。它还设置了超参数调整技术。
这些技术是。
tuner- 它设置了超参数调谐技术。我们将使用Optuna来自动搜索最佳神经网络参数。max_trials- 它是在超参数调谐过程中由 测试的最大组合数。Optunaimage_directory- 它指定了图像目录。image_height- 它指定了图像的高度。image_channels- 它指定了图像类别的数量。
在初始化神经网络后,让我们将神经网络拟合到我们的数据集上。
拟合神经网络
拟合神经网络允许模型从训练图像中学习。这将使模型获得有用的洞察力,它将用来进行预测。
为了适应神经网络,我们使用下面的代码。
model = deepauto.fit("", "", keras_model_type=keras_model_type,
project_name='rock_paper_scissors_classifier',
save_model_flag=False, model_options=model_options,
keras_options=keras_options, use_my_model='', verbose=0)
我们使用deepauto.fit 函数来适应神经网络。在该函数中,我们将project_name 作为rock_paper_scissors_classifier 。其他的函数值是在初始化过程中设置的参数。我们还使用save_model_flag 来指定我们是否要保存我们的模型。
当代码被执行时,它将模型的建立过程自动化。然后它产生不同的输出来显示进展。第一个输出显示了使用rock-paper-scissors 数据集的模型训练。该输出还显示了用于加速该过程的GPU数量。
这个输出显示在下面的图片中。

从上面的图片来看,我们正在使用1个物理GPU和1个逻辑GPU。这些模型从给定的图像目录下的图像中学习。
神经网络对训练数据集进行了3次迭代。它在每次迭代后都会打印出准确率分数。最终的准确度得分是0.96875 。
接下来的输出显示了一些图像。

Deep AutoViML还自动绘制了Model Training vs Validation loss 和Model Training vs Validation Accuracy 图。这些图显示在下面。

左边的图显示了Model Training vs Validation loss 。从图像中,我们可以看到train_loss 和val_loss 随着时间的推移而减少。这表明我们的模型随着训练过程的继续而改进。
右图显示了Model Training vs Validation Accuracy 。我们可以看到train_accuracy 和val_accuracy 随着时间的推移而增加。这表明我们的模型随着训练过程的继续而改进。
模型类型和神经网络的层数
这个输出显示了模型类型和神经网络的层数。它还显示了模型的摘要和参数。这些参数被分为可训练参数和不可训练参数。
这个输出表示神经网络的结构。

从上面的图片来看,模型的类型是顺序的。顺序模型允许层与层之间相互构建。它还显示了模型的总参数(2,261,827)。
可训练参数(3,843)是神经网络将训练的参数。不可训练的参数(2,257,984)已经被训练过了。
我们从预训练的MobileNet中导入不可训练的参数。非训练参数的数量比可训练参数的数量多。这就节省了训练时间。
最后,Deep AutoViML自动进行一些预测。它对测试集中的一些图像进行分类。它打印出图像的actual label 和predicted label 。
actual label 显示了实际的图像类别。predicted label 显示模型预测的类别。如果actual label 和predicted label 匹配,模型将作出正确的预测。
这个输出显示在下面的图片中。

从上面的图片中,该模型对6张图片进行了分类。对于所有的图像,actual label 和predicted label 匹配。这表明,我们的模型能够做出正确的预测。
我们还实现了多类图像分类。该模型能够将一幅图像归入三个类别中的一个。
总结
在本教程中,我们使用Deep AutoViML进行了一个多类图像分类器。我们讨论了用于建立强大的深度学习模型的Deep AutoViML功能。
使用这些特征,我们能够建立一个多类图像分类模型。最后的模型能够对玩剪刀石头布游戏的手的图像进行分类。