Как применить SMOTE к набору данных tensorflow без нехватки оперативной памяти

#numpy #tensorflow #ram #imbalanced-data #smote

Вопрос:

Я работал над несбалансированным набором данных с почти 17 тысячами изображений и пытался реализовать метод передискретизации, такой как SMOTE, используя библиотеку несбалансированного обучения. Изображения и метки загружаются в виде тензоров, в то время как методы, доступные в библиотеке несбалансированного обучения, требуют массивов numpy. Я уже пытался извлечь изображения из набора данных tensorflow, но примерно после 10 тысяч изображений моя сессия в Google colab завершается сбоем, потому что у меня заканчивается оперативная память. Я также пытался найти другой подход, но не смог найти ничего другого. Вот почему я хотел бы знать, есть ли у вас какие-либо предложения, которые действительно могли бы помочь мне преодолеть эту проблему.

Я следую следующему шагу:

Я импортирую данные с помощью каталога tf.keras.предварительная обработка.image_dataset_from_directory.

 def create_dataset(folder_path, name, split, seed, shuffle=True):
  return tf.keras.preprocessing.image_dataset_from_directory(
    folder_path, labels='inferred', label_mode='categorical', color_mode='rgb',
    batch_size=32, image_size=(320, 320), shuffle=shuffle, interpolation='bilinear',
    validation_split=split, subset=name, seed=seed)

valid_split = 0.3
train_set = create_dataset(dir_path, 'training', valid_split, 42, shuffle=True).prefetch(1)
valid_set = create_dataset(dir_path, 'validation', valid_split, 42, shuffle=True).prefetch(1)

# output:
# Found 16718 files belonging to 38 classes.
# Using 11703 files for training.
# Found 16718 files belonging to 38 classes.
# Using 5015 files for validation.
 

Затем я запускаю эту строку кода, чтобы получить изображения из набора данных tf в виде массива numpy, но, как я уже говорил, в этот момент мой сеанс завершается сбоем.

 X_train = np.concatenate([x for x, y in train_set], axis=0)
 

Спасибо за вашу поддержку.

Комментарии:

1. Может быть, вы могли бы обернуть его с помощью функции numpy_function