【问题标题】:Neural network classifies everything into one class, recall=1 on imbalanced dataset神经网络将所有内容归为一类,recall=1 在不平衡的数据集上
【发布时间】:2018-08-31 06:33:47
【问题描述】:

我正在尝试使用 Keras 中的深度神经网络(尤其是 VGG16)进行二进制分类。不幸的是,我有一个非常不平衡的数据集(15.000/1.800 张图像),但找不到规避它的方法..

我看到的结果 (关于训练和验证数据)

  • 召回=1
  • Precision = 0.1208(这正是0 类和1 类样本之间的比率)
  • AUC = 0.88(使用 SGD 大约 30 个 epoch 后,似乎是 1 - Precision

我做了什么

  • 使用 this little helper 从损失/准确度指标切换到 AUC
  • 使用 class_weight 就像描述的 here 这似乎没有帮助
  • 尝试不同的优化器(SGD、Adam、RMSProp)
  • BatchNormalization 层添加到我的(未经训练的)VGG16 并在卷积层上将use_bias 设置为False将我的整个网络视为gist here
  • 使用 Keras 内置 ImageDataGenerator 进行扩充以扩大数据集。

我认为可以进一步提供帮助的方法(但尚未尝试)

  1. 对一类比另一类进行更多的数据扩充。不幸的是,我为我的整个训练数据使用了一个 ImageDataGenerator,但我不知道如何增加一个类而不是另一个类。
  2. 也许是一个自定义损失函数,它会更多地惩罚错误的决定?我将如何实施?目前我只使用binary_crossentropy
  3. 理论上我可以调整类成员阈值以进行预测,但这对训练没有帮助,也不会改善结果,对吧?
  4. 可能会像建议的here 那样减少批量大小。但我真的不明白为什么这会有所帮助。目前我正在以编程方式确定批量大小,以便在一个时期内向网络显示所有训练和验证数据: steps_per_epoch = int(len(train_gen.filenames) / args.batch_size) validation_steps = int(len(val_gen.filenames) / args.batch_size)

您认为我应该首先解决什么问题还是您有更好的主意?对于实施细节方面的每一个帮助,我也很高兴。

非常感谢您!

【问题讨论】:

    标签: python tensorflow machine-learning neural-network keras


    【解决方案1】:

    也许尝试像https://community.rstudio.com/t/ensure-balanced-mini-batches-while-training/7505 (R Studio) 中描述的那样准备类平衡批次(包括类 1 的加倍)。另请阅读Neural Network - Working with a imbalanced datasetbalancing an imbalanced dataset with keras image generator

    另一种可能性是在预处理中执行特征提取,这意味着让图像处理算法在图像上运行以突出特征特征

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 2016-12-04
      • 2019-02-08
      • 1970-01-01
      • 2017-11-14
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      相关资源
      最近更新 更多