2

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

  • 性别:男/女

  • 类型 clotes:西装外套、西装外套和夹克、衬衫、开衫、大衣、外套和夹克、裙裤、连衣裙、牛仔裤、套头衫、连身裤和工装裤、针织衫和运动衫、打底裤和香烟裤、孕妇装、Polo、Pololong、衬衫、短裤、裙子、西装、泳装、泳装和沙滩装、T - 衬衫、T 恤和上衣、裤子、束腰外衣。

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

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

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

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

我所做的事情
似乎很清楚,我处于多标签分类环境中。
1. 清理和预处理我
创建的数据(X,Y)数据,其中X的形状为(1814,204,204,3)Y的形状为(1814,39) '' 39 对应于虚拟变量:类别 1 有2 个属性,第 2 类有 26 个属性,第 3 类有 11 个属性:所以总共是 39 ''。
2.建立我的神经网络
我的模型的不同参数是:

  • 历元 = 100
  • lrate = 0.001
  • 衰减 = lrate/epochs
  • sgd = SGD(lr=lrate,动量=0.9,衰减=衰减,nesterov=False)
  • 损失=二进制交叉熵
  • 优化器=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. 我不认为我的 metric ='accuracy' 是一个好的选择:它并不能反映所发生事情的现实。例如,我对我的训练数据进行了评估测试,得到了 0.95(95% 的 bin 分类良好),但这并不意味着模型表现良好,因为在每个输出中:应该有 3 个39 个分量,其余的都是零。所以很有可能有很多零,因此即使在最坏的情况下,39 个值被预测为 0(没有检测到)比我们的 36/39 精度:哪个不能反映真正的问题?(这就是我得到的结果,对于给定的 X,我得到了许多接近零的值,所以当我使用阈值(0.5)时,它使一切都等于零:
  2. 你认为我的模型表现不佳是因为我没有很多图像吗?(每个标签的图像)?
  3. 你认为我的模型性能不好是因为神经网络的结构不好吗?我尝试使用预训练模型来修复第一层,因为最先进的技术表明这些层负责检测边缘,而我只训练了下一层:在这种情况下,我的结果也很糟糕(通过“准确度”指标计算) ?
  4. 总而言之,我知道我的问题可能没有通用的解决方案,但至少我想知道可能导致这些问题的原因以及如何解决这些问题?因此,欢迎任何帮助,尤其是来自在输出中有许多标签的多标签分类工作的人
4

1 回答 1

0

好吧,有很多关于“下一步要尝试什么”和“如何使神经网络工作”的主题和网页,但我会从

1) 平衡数据,使每个标签均等出现。如果您的大部分数据集由“男性,蓝色牛仔裤”组成,那么这将对损失函数的贡献最大,因此优化器将关注这种情况,而不是“女性,fedora”情况你可能有一个样本。因此,只需复制数据,以便所有采样均相同。你也可以做一个稍微复杂一点的加权成本。

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

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

祝你好运。

于 2018-04-17T19:06:56.630 回答