多标签分类项目:如何改善糟糕的表现

时间:2018-04-17 18:12:54

标签: tensorflow computer-vision deep-learning keras convolutional-neural-network

情境
我正在构建一个模型,用于识别给定图像中的三个类别 有三类:

  • 性别:男/女

  • 类型clotes:开拓者,开拓者&夹克,衬衫,开衫,外套,外套和夹克,裙裤,连衣裙,牛仔裤,套头衫,连身衣和工装裤,针织衫和运动衫,护腿& CigaretteTrousers,Maternity,Polo,Pololong,Shirts,Shorts,Skirts,Suits,Swimwear,Swimwear&沙滩装,T恤,T恤和&上衣,长裤,罩衫。

  • 颜色衣服:米色,黑色,蓝色,棕色,绿色,灰色,橙色,粉红色,红色,白色,黄色。

换句话说,每张图片都应该有这3个类别(每个类别一个值)。

数据
我的训练我的模型的数据库由 1812 图像和一个excel文件组成,其中包含每个图像(及其网址)的三个类别的值。
以下是有关我的数据库的一些信息:

  • 男性人数:759
  • 女性人数:1055
  • 我还有每个属性(来自每个类别)出现在我的数据库中的次数(我无法列出所有这些属性,但如果它对解释有用,我可以发送给你信息)
  • 最出现的三联体是(男性,牛仔裤,蓝色):66次

我做了什么
很明显,我处于多标签分类环境中 的 1。清洁&预处理我的数据
我创建了(X,Y)数据,其中 X 的形状(1814,204,204,3) Y 形状(1814,39)'' 39对应于虚拟变量:类别1具有2个属性,类别2具有26个属性,类别3具有11个属性:因此总计为39''。 的 2。建立我的神经网络
我的模型的不同参数是:

  • epochs = 100
  • lrate = 0.001
  • decay = lrate / epochs
  • sgd = SGD(lr = lrate,动量= 0.9,衰减=衰减,nesterov = False)
  • loss = binary_crossentropy
  • optimizer = sgd
  • 度量=精度

我训练有素的网络结构如下:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_3 (Conv2D)            (None, 204, 204, 32)      896       
_________________________________________________________________
dropout_3 (Dropout)          (None, 204, 204, 32)      0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 204, 204, 32)      9248      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 102, 102, 32)      0         
_________________________________________________________________
flatten_2 (Flatten)          (None, 332928)            0         
_________________________________________________________________
dense_3 (Dense)              (None, 512)               170459648 
_________________________________________________________________
dropout_4 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_4 (Dense)              (None, 39)                20007     
_________________________________________________________________
activation_1 (Activation)    (None, 39)                0         
=================================================================
Total params: 170,489,799
Trainable params: 170,489,799
Non-trainable params: 0

问题

  1. 我不认为我的指标='准​​确度'是一个不错的选择:它并不能反映所发生事件的真实性。例如,我对我的训练数据进行了评估测试,得到了0.95(所有垃圾箱的95%被分类很好),但这并不意味着模型表现良好,因为在每个输出中:应该有3个输出在39个组件中,所有剩余的都是零。所以很有可能有很多零,因此即使在更糟糕的情况下,39个值预测为0(没有检测到任何东西)比我们有36/39准确性:哪个不能反映实际问题? (这就是我得到的结果,对于给定的X,我有很多值接近零,所以当我使用一个阈值(0.5)时,它使一切都等于零:我试图实现一个基于的阈值使用mathiew相关系数的统计方法:但仍然没有添加任何有用的东西。)那么,您认为对于多标签分类问题(许多(39)标签输出)的良好指标是什么?
  2. 你认为我模特的糟糕表现来自于我没有很多影像吗? (每个标签的图像)?
  3. 你认为我的模型性能不好,因为神经网络的结构不好吗?我尝试使用预先训练的模型来修复第一层,因为现有技术说这些层负责检测边缘,我只训练下一层:在这种情况下,我也有不好的结果(通过'准确度'指标?
  4. 总而言之,我知道也许我的问题没有通用的解决方案,但至少我想知道可能导致这些问题的原因以及如何解决这些问题?因此,欢迎任何帮助,尤其是那些在输出中使用多种标签进行多标签分类的人,

1 个答案:

答案 0 :(得分:0)

嗯,有很多主题和网页关于"接下来要尝试的内容"和#34;如何使神经网络工作"但我会从

开始

1)平衡数据,使每个标签看起来均等。如果您的大多数数据集都是由男性,蓝色牛仔裤和#34;那么这将最有助于损失函数,因此优化器将专注于这种情况,但不是,例如,女性,Fedora"案例,你可以有一个样本。因此,只需复制数据,以便所有采样均匀显示。您还可以执行加权成本,但需要更多参与。

2)从上面继续,从一个小的平衡数据集开始,看看你是否可以过度拟合(从每个类中选择一个数据点)。这将为您提供一个良好的起点并消除错误。从那时起,开始添加越来越多的数据并监控损失功能。

3)对于指标,计算准确性,精确度和每个类的召回(性别,类型,颜色)。如果你没有很多课程,你也可以计算出我个人最喜欢的混淆矩阵。在这个优秀的页面上有一个很好的混淆矩阵(和其他指标)演示(演示:查看神经网络) https://ml4a.github.io/ml4a/looking_inside_neural_nets/

祝你好运。