使用 SMOTE 对图像数据进行过采样

Posted

技术标签:

【中文标题】使用 SMOTE 对图像数据进行过采样【英文标题】:Use SMOTE to oversample image data 【发布时间】:2019-05-09 01:21:19 【问题描述】:

我正在使用 CNN 进行二进制分类,并且数据不平衡,其中阳性医学图像:阴性医学图像 = 0.4:0.6。所以我想在训练之前使用 SMOTE 对阳性医学图像数据进行过采样。 但是,数据的维度是 4D (761,64,64,3) 导致错误

Found array with dim 4. Estimator expected <= 2

所以,我重塑了我的 train_data:

X_res, y_res = smote.fit_sample(X_train.reshape(X_train.shape[0], -1), y_train.ravel())

而且效果很好。在将其提供给 CNN 之前,我通过以下方式对其进行了重塑:

X_res = X_res.reshape(X_res.shape[0], 64, 64, 3)

现在,我不确定它是否是过采样的正确方法,并且 reshape 运算符是否会更改图像的结构?

【问题讨论】:

您好,您是否进行了测试以检查您的 shape/reshape 操作是否正常? 【参考方案1】:

我遇到了类似的问题。我使用了 reshape 函数来重塑图像(基本上是扁平化的图像)

X_train.shape
(8000, 250, 250, 3)

ReX_train = X_train.reshape(8000, 250 * 250 * 3)
ReX_train.shape
(8000, 187500)

smt = SMOTE()
Xs_train, ys_train = smt.fit_sample(ReX_train, y_train)

虽然这种方法慢得可怜,但有助于提高性能。

【讨论】:

另外,就像对上一个问题的扩展。如果您使用的是预训练网络和特征提取方法,则无需重新调整扁平图像的形状。但如果不是,图像将再次被重新塑造回原始尺寸。另外,还有一篇关于 SMOTE 的文章可以提供帮助:medium.com/@adib0073/…【参考方案2】:
    一旦您将图像展平,就会丢失本地化信息,这就是为什么在基于图像的机器学习中使用卷积的原因之一。 8000x250x250x3 具有内在含义 - 8000 个图像样本,每个图像的宽度为 250,高度为 250,并且当您进行 8000x250*250*3 重塑时,它们都有 3 个通道,除非您使用某种序列网络教它的坏处。 过采样对图像数据不利,您可以进行图像增强(20crop,引入高斯模糊、旋转、平移等噪声)

【讨论】:

你有什么可以证明你的第三个想法的名言吗?关于“过采样对图像数据不利”? 当我说“过采样不好”时,我的意思是如果我们尝试只复制低级图像的数量,我们并没有试图概括,它会多次看到相同的图像,在某些情况下案例会导致过拟合。再次对不确定的声明感到抱歉 只是想讨论一下。那么除了augment之外,你知道任何处理不平衡问题的方法吗?我面临的数据集主要 - 次要为 98 - 2,这意味着该数据集中只有 2% 是一个类 假设图像数据,我仍然建议 k-fold (scikit-learn.org/stable/modules/generated/…) + 图像参数 (github.com/albumentations-team/albumentations) 除非你正在做异常检测 98-2 真的很糟糕。 我认为过采样然后只增加次要类是个好主意 (medium.com/swlh/…)【参考方案3】: 首先展平图像 对这个展平的图像数据及其标签应用 SMOTE 将扁平化图像重塑为 RGB 图像
from imblearn.over_sampling import SMOTE
    
sm = SMOTE(random_state=42)
    
train_rows=len(X_train)
X_train = X_train.reshape(train_rows,-1)
(80,30000)

X_train, y_train = sm.fit_resample(X_train, y_train)
X_train = X_train.reshape(-1,100,100,3)
(>80,100,100,3)

【讨论】:

以上是关于使用 SMOTE 对图像数据进行过采样的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 中的过采样或 SMOTE

spark实现smote近邻采样

从信用卡欺诈模型看不平衡数据分类数据层面:使用过采样是主流,过采样通常使用smote,或者少数使用数据复制。过采样后模型选择RFxgboost神经网络能够取得非常不错的效果。模型层面:

仅在训练折叠上使用带有 SMOTE 过采样的 sklearn 的 RandomizedSearchCV

过采样:Python 中二进制和分类数据的 SMOTE

如何在CV-ing数据集中实现基于比率的SMOTE过采样