图像分类SMOTE上采样问题解析及临时解决方法
图像分类中SMOTE上采样的问题
背景
我拥有一个含12类的图像数据集,为对比不同图像分类上采样技术,计划使用SMOTE对严重不平衡类别进行上采样。
训练集定义
我按如下方式定义训练集:
img_height = 256 img_width = 256 batch_size = 32 train_ds = tf.keras.utils.image_dataset_from_directory( image_directory, validation_split=0.2, subset="training", seed=123, image_size=(img_height, img_width), batch_size=batch_size)
运行后输出:
Found 11730 files belonging to 12 classes. Using 9384 files for training.
数据提取与SMOTE执行问题
SMOTE需要明确的x_train和y_train,我尝试通过以下代码获取:
for images, labels in train_ds: # only take first element of dataset numpy_images = images.numpy() numpy_labels = labels.numpy() numpy_images.shape
返回的形状为(8,256,256,3),不符合预期的(9384,256,256,3)。
随后我将numpy数组重塑为2D以传入SMOTE:
x_train = numpy_images.reshape(8, 256 * 256 * 3) x_train.shape
返回形状为(8, 196608)
执行SMOTE代码:
from imblearn.over_sampling import SMOTE sm = SMOTE(random_state=42) X_smote, y_smote = SMOTE(k_neighbors=2).fit_resample(x_train, numpy_labels)
最终返回错误:n_samples = 1, n_neighbors = 2
疑问
- 如何解决上述问题?
- 为什么numpy数组的形状是
(8,256,256,3)而非(9384,256,256,3)?
临时解决方法
我目前的临时解决方法是:在文件资源管理器中手动复制指定数量的欠采样类别图像。
内容的提问来源于stack exchange,提问作者James Anderson
相关产品推荐
相关产品推荐

