首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不平衡图像数据集(Tensorflow2)

不平衡图像数据集(Tensorflow2)
EN

Stack Overflow用户
提问于 2021-02-03 04:03:04
回答 3查看 832关注 0票数 3

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

有没有办法解决这个问题,我想尝试一下随机/随机加权过采样。

我试过很多不同的方法,但是我被卡住了。我尝试过使用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参数/过采样?

代码语言:javascript
复制
data/
...class_1/
........image_1.jpg
........image_2.jpg
...class_2/
........image_1.jpg
........image_2.jpg

我的数据采用上面所示的形式。

代码语言:javascript
复制
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,因为它们具有自动(超过/低于)使用sampler=WeightedRandomSampler采样的数据加载器的参数。

注意:我已经看了很多关于如何过采样的教程,但是没有一个是图像分类问题,我想继续使用TF/Keras,因为它允许简单的迁移学习,你们能帮助我吗?

EN

回答 3

Stack Overflow用户

发布于 2021-05-29 20:36:43

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

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2021-02-03 21:19:36

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

代码语言:javascript
复制
from imblearn.over_sampling import SMOTE

oversample = SMOTE()
X, y = oversample.fit_resample(X, y)
票数 0
EN

Stack Overflow用户

发布于 2021-02-03 21:34:53

由于您已经将class_weight定义为字典,例如{0: 10, 1: 1},因此您可以尝试扩充少数类。在https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html上查看balancing an imbalanced dataset with keras image generator和教程(在那里提到过)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66016844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档