您正在寻找的术语是多标签分类,即您在每个图像上进行多个分类(每个标签一个分类)。您可以在网上找到的大多数示例都在 NLP 领域,但使用 CNN 也很容易,因为它本质上是由输出层的结构和使用的损失函数定义的。如果您已经熟悉 CNN,它并不像听起来那么复杂。
神经网络的输出层(对于 3 个或更多类)具有与目标一样多的单元。网络学习将这些单元中的每一个与相应的类相关联。多类分类器通常将 softmax 激活函数应用于原始单元输出,从而产生概率向量。为了得到最终的分类,max()采用概率向量的 (最可能的类)。输出将如下所示:
Cat Bird Plane Superman Ball Dog
Raw output: -1 2 3 6 -1 -1
Softmax: 0.001 0.017 0.046 0.934 0.001 0.001
Classification: 0 0 0 1 0 0
多标签分类通常使用 sigmoid 激活函数,因为可以独立处理标签出现的概率。然后由概率确定分类(>=0.5 表示 True)。对于您的问题,此输出可能如下所示:
Big nose Long hair Curly hair Superman Big ears Sharp Jawline
Raw output: -1 -2 3 6 -1 10
Sigmoid: 0.269 0.119 0.953 0.998 0.269 1.000
Classification: 0 0 1 1 0 1
二元交叉熵损失函数通常用于多标签分类器,因为n标签问题本质上是将多类分类问题分解为n 个二元分类问题。
由于从多类分类器到多标签分类器所需要做的就是更改输出层,因此使用预训练网络非常容易。如果您从 Keras 获得预训练模型,那么它就像include_top=False下载模型然后添加正确的输出层一样简单。
对于 13000 张图像,我建议使用 Keras 的ImageDataGenerator类和该flow_from_dataframe方法。这使您可以使用简单的 pandas 数据框来标记和输入所有图像。数据框如下所示:
Filename Big nose Long hair Curly hair Superman Big ears Sharp Jawline
0001.JPG 0 0 1 1 0 1
0002.JPG 1 0 1 0 1 1
. . . . . . .
flow_from_dataframe的class_mode参数可以设置为raw或multi_output与x_colto'Filename'和y_colto一起设置['Big nose', 'Long hair', 'Curly hair', 'Superman', 'Big ears', 'Sharp Jawline'](在此示例中)。查看文档以获取更多详细信息。
每个标签所需的数据量取决于许多因素,如果不尝试,基本上不可能知道。13000 听起来像是一个好的开始,但这也取决于您拥有多少标签以及它们在标签之间的分布情况。可以在此处找到有关如何设置多标签分类器以及如何使用 Keras 实现它的体面指南(众多指南之一)。它还涵盖了标签频率的不平衡,非常值得一读。我强烈建议您在开始调整神经网络架构之前尽可能熟悉您的数据集。