【发布时间】:2021-05-07 01:18:32
【问题描述】:
我正在尝试解决二值图像分类问题,但是这两个类(分别为 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,
batch_size = BACTH_SIZE,
class_mode = 'binary',
target_size = (IMG_HEIGHT, IMG_WIDTH),
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 比较陌生,但我对整个机器学习有一些经验。我曾多次想切换到 PyTorch,因为它们有数据加载器的参数,可以自动(过度/不足)采样 sampler=WeightedRandomSampler。
注意:我看过很多关于如何过采样的教程,但是它们都不是图像分类问题,我想坚持使用 TF/Keras,因为它可以轻松进行迁移学习,你们能帮忙吗?
【问题讨论】:
标签: tensorflow keras imbalanced-data image-classification oversampling