神经网络将所有事物归为一类,不平衡数据集的召回率= 1

时间:2018-08-31 06:33:47

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

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

我看到的结果 (有关培训和验证数据)

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

我做了什么

  • this小帮手的帮助下从损失/准确性指标转换为AUC
  • 使用class_weight之类的here似乎无济于事
  • 尝试不同的优化程序(SGD,Adam,RMSProp)
  • 在我的(未经训练的)VGG16中添加BatchNormalization层,并在卷积层上将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)

您认为我应该首先解决什么,或者您有更好的主意?对于实施细节方面的每一次帮助,我也感到很高兴。

非常感谢您!

1 个答案:

答案 0 :(得分:0)

也许可以像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

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