微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不平衡图像数据集 (Tensorflow2)

如何解决不平衡图像数据集 (Tensorflow2)

我正在尝试做一个二值图像分类问题,但是这两个类(分别为 1 类和 2 类的 ~590 和 ~5900 个实例)严重偏斜,但仍然非常不同。

有什么办法可以解决这个问题,我想尝试 SMOTE/随机加权过采样。

我尝试了很多不同的东西,但我被卡住了。我已经尝试使用 class_weights=[10,1][5900,590][1/5900,1/590],但我的模型仍然只能预测第 2 类。 我试过使用 tf.data.experimental.sample_from_datasets 但我无法让它工作。我什至尝试过使用 sigmoid 焦点交叉熵损失,这有很大帮助,但还不够。

我希望能够对第 1 类进行 10 倍的过采样,我尝试过的唯一有效的方法是手动过采样,即复制火车目录的第 1 类实例以匹配第 2 类中的实例数量

没有更简单的方法可以做到这一点,我正在使用 Google Colab,因此这样做效率极低。

有没有办法在数据生成器或类似工具中指定 SMOTE 参数/过采样?

data/
...class_1/
........image_1.jpg
........image_2.jpg
...class_2/
........image_1.jpg
........image_2.jpg

我的数据如上图所示。

TRAIN_DATAGEN = ImageDataGenerator(rescale = 1./255.,rotation_range = 40,width_shift_range = 0.2,height_shift_range = 0.2,shear_range = 0.2,zoom_range = 0.2,horizontal_flip = True)

TEST_DATAGEN = ImageDataGenerator(rescale = 1.0/255.)

TRAIN_GENERATOR = TRAIN_DATAGEN.flow_from_directory(directory = TRAIN_DIR,batch_size = BACTH_SIZE,class_mode = 'binary',target_size = (IMG_HEIGHT,IMG_WIDTH),subset = 'training',seed = DATA_GENERATOR_SEED)

VALIDATION_GENERATOR = TEST_DATAGEN.flow_from_directory(directory = VALIDATION_DIR,subset = 'validation',seed = DATA_GENERATOR_SEED)
...
...
...

HISTORY = MODEL.fit(TRAIN_GENERATOR,validation_data = VALIDATION_GENERATOR,epochs = EPOCHS,verbose = 2,callbacks = [EARLY_STOPPING],class_weight = CLASS_WEIGHT)

我对 Tensorflow 比较陌生,但我对 ML 整体有一些经验。我多次尝试切换到 PyTorch,因为它们有数据加载器的参数,可以使用 sampler=WeightedRandomSampler 自动(过度/不足)采样。

注意:我看过很多关于如何过采样的教程,但都不是图像分类问题,我想坚持使用 TF/Keras,因为它可以轻松进行迁移学习,你们能帮忙吗?

解决方法

您可以使用此策略根据不平衡情况计算权重:

from sklearn.utils import class_weight 
import numpy as np

class_weights = class_weight.compute_class_weight(
           'balanced',np.unique(train_generator.classes),train_generator.classes)

train_class_weights = dict(enumerate(class_weights))
model.fit_generator(...,class_weight=train_class_weights)
,

在 Python 中,您可以使用 imblearn 库实现 SMOTE,如下所示:

from imblearn.over_sampling import SMOTE

oversample = SMOTE()
X,y = oversample.fit_resample(X,y)
,

由于您已经将 class_weight 定义为字典,例如 {0: 10,1: 1},您可以尝试扩充少数类。请参阅 balancing an imbalanced dataset with keras image generatorhttps://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

处的教程(在那里提到)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。