不平衡图像数据集(Tensorflow2)



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

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

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

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

有没有更简单的方法来做到这一点,我使用谷歌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比较陌生,但我对整个ML有一些经验。我已经多次尝试切换到PyTorch,因为它们有数据加载器的参数,可以自动(over/under)使用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},您可以尝试增加少数类。请参阅使用keras图像生成器平衡不平衡数据集和教程(在那里提到)https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

相关内容

  • 没有找到相关文章

最新更新