作者:Adrian Rosebrock
翻译:程思衍
校对:付宇帅
本文约7000字,建议阅读10+分钟。
本文将通过拆解SmallVGGNet的架构及代码实例来讲解如何运用Keras进行多标签分类。
本文的灵感来源于我收到的一封来自PyImageSearch的读者Switaj的邮件。
他写到:
你好,Adrian,感谢PyImageSearch,感谢你每周都分享你的知识。我正在构建一个时尚图像的搜索引擎,我需要你的帮助。使用我的app,用户可以上传一张他们喜欢的服饰的图片(如衬衫、裙子、裤子、鞋类),我的系统将会返回相似的物品并附上购买链接。
问题是我需要训练一个分类器来将物品分到不同的类别中:
服饰类别:衬衫、裙子、裤子、鞋类等
颜色:红、蓝、黑等
质地:棉、羊毛、丝、麻等
我已经为这三个不同的类别训练了三个不同的卷积神经网络(下文将称为CNN),效果非常好。
是否有办法让这三个CNN合并为一个CNN呢?或者至少训练一个神经网络来完成三项分类任务?
我不想在if / else代码的级联中单独应用它们,这些代码使用不同的网络,具体取决于先前分类的输出。
谢谢你的帮助
Switaj提出了一个美妙的问题:
Keras深度神经网络是否有可能返回多个预测?
如果可以,它是如何完成的?
基于Keras的多标签分类问题
本文将分为4个部分。
在第一部分,我将讨论我们的多标签分类数据集(以及如何快速构建属于你自己的数据集)。
之后我们将简要讨论SmallerVGGNet,它是我们将要实现的一个用于多标签分类的Keras神经网络结构。
紧接着我们将构建SmallerVGGNet并应用我们的多标签分类数据集来训练他。
最后,我们将基于样例图片测试我们的神经网络,并讨论何时使用多标签分类问题最为合适,包括您需要注意的一些注意事项。
我们的多标签分类数据集
图片1:一份多类别深度学习数据集的组合。我们将使用Keras来训练一个多标签分类器来预测衣服的颜色以及类别。
我们将使用的数据集以用于今天的Keras多标签分类教程旨在模仿本文先前提到的Switaj’s的问题(尽管我们基于本文对它进行了简化)。
我们的数据集由2167张图片组成,它们来自6个不同的种类,包括:
黑色牛仔裤(344张图片)
蓝色裙子(386张图片)
蓝色牛仔裤(356张图片)
蓝色衬衫(369张图片)
红色裙子(380张图片)
红色衬衫(332张图片)
我们的卷积神经网络的目标是同时预测颜色和服饰类别。
我构建该数据集通过遵循我之前发布过的博文:
How to (quickly) build a deep learning image dataset
下载图片以及手动为该6个类别剔除不相关图片的整个过程将耗费大概30分钟。
当你在尝试构建你自己的深度学习数据集时,请确保你遵循了上述教程链接——它将帮助你快速启动构建你自己的数据集。
多标签分类项目结构
请直接访问本文的“下载”处以获得源代码及文件。一旦你解压缩了zip文件,你将会看到如下的目录结构:
在该zip文件的根目录下,你会看到6个文件及3个文件夹。
我们将用到的重要文件(基于它们本文出现的大致顺序)包括:
search_bing_api.py:此脚本使我们能够快速构建深度学习图像数据集。你不需要运行这段脚本因为图片数据集已经囊括在zip文件中。我附上这段脚本仅为保证(代码的)完整性。
train.py:一旦我们拥有了数据,我们将应用train.py训练我们的分类器。
fashion.model:我们的train.py脚本将会将我们的Keras模型保存到磁盘中。我们将在之后的classify.py脚本中用到它。
mlb.pickle:一个由train.py创建的scikit-learn MultiLabelBinarizer pickle文件——该文件以顺序数据结构存储了各类别名称。
plot.png:训练脚本会生成一个名为plot.png的图片文件。如果你在你自己的数据集上训练,你便需要查看这张图片以获得正确率/风险函数损失及过拟合情况。
classify.py:为了测试我们的分类器,我写了classify.py。在你将模型部署于其他地方(如一个iphone的深度学习app或是树莓派深度学习项目)之前,你应该始终在本地测试你的分类器。