【发布时间】: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进行扩充以扩大数据集。
我认为可以进一步提供帮助的方法(但尚未尝试)
- 对一类比另一类进行更多的数据扩充。不幸的是,我为我的整个训练数据使用了一个
ImageDataGenerator,但我不知道如何增加一个类而不是另一个类。 - 也许是一个自定义损失函数,它会更多地惩罚错误的决定?我将如何实施?目前我只使用
binary_crossentropy。 - 理论上我可以调整类成员阈值以进行预测,但这对训练没有帮助,也不会改善结果,对吧?
- 可能会像建议的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