жесткий пользовательский ImageDataGenerator

1

В любом случае мы можем добавить некоторые функции к ImageDataGenerator, чтобы ImageDataGenerator мог взять список имен файлов и случайные образцы изображений для каждой мини-бара?

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

Вот что я сделал:

for epoch in range(epochs):
    print("epoch is: %d, total epochs: %f" % ((epoch+1), int(epochs)))
    print("prepare training batch...")
    train_batch = makebatch(filelist=self.train_files, img_num=img_num, slice_times=slice_times)
    print("prepare validation batch..")
    val_batch = makebatch(filelist=self.val_files, img_num=int(math.ceil(img_num*0.2)), slice_times=slice_times)

    x_train = train_batch
    y_train = x_train

    x_val = val_batch
    y_val = x_val

    print("generate training data...")

    train_datagen.fit(x_train)
    train_generator = train_datagen.flow(
        x=x_train,
        y=y_train,
        batch_size=16)
    val_datagen.fit(x_val)
    val_generator = val_datagen.flow(
        x=x_val,
        y=y_val,
        batch_size=16)

    print("start training..")

    history = model.fit_generator(
            generator=train_generator,
            steps_per_epoch=None,
            epochs=1,
            verbose=1,
            validation_data=val_generator,
            validation_steps=None,
            callbacks=self.callbacks)

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

Кто-то может помочь с этим?

Теги:
keras

1 ответ

1
Лучший ответ

Вот, что бы я сделал.

Предположим, у меня есть список путей ко всем изображениям, хранящимся в переменных X_train, X_validation, а метки хранятся как y_train и y_validation.

Во-первых, я бы определил генератор последовательности. (Это с сайта keras)

from skimage.io import imread
from skimage.transform import resize
import numpy as np

# Here, 'x_set' is list of path to the images
# and 'y_set' are the associated classes.

    class CIFAR10Sequence(Sequence):

        def __init__(self, x_set, y_set, batch_size):
            self.x, self.y = x_set, y_set
            self.batch_size = batch_size

        def __len__(self):
            return int(np.ceil(len(self.x) / float(self.batch_size)))

        def __getitem__(self, idx):
            batch_x = self.x[idx * self.batch_size:(idx + 1) * self.batch_size]
            batch_y = self.y[idx * self.batch_size:(idx + 1) * self.batch_size]

            return np.array([
                resize(imread(file_name), (200, 200))
                   for file_name in batch_x]), np.array(batch_y)

Теперь я бы определил генератор для обучения и проверки как

Xtrain_gen = detracSequence(X_train,y_train,batch_size=512) # you can choose your batch size.
Xvalidation_gen = detracSequence(X_validation,y_validation,batch_size=512)

Теперь, последний шаг к обучению модели

model.fit_generator(generator=Xtrain_gen, epochs=100, validation_data=Xvalidation_gen,use_multiprocessing=True)

Это позволит избежать цикла for для вас, и это очень эффективно, потому что CPU извлекает данные параллельно.

  • 0
    Я думаю, это может быть как-то связано с тем, что я ищу. Потому что, если я запускаю свой скрипт, ему не хватит памяти. Но можем ли мы по-прежнему использовать ImageDataGenerator? Потому что я хочу использовать это для увеличения данных изображения. Но я надеюсь добавить функциональность для выборки случайных данных из списка путей к файлам для каждого пакета.
  • 0
    и вопрос в том, как мы устанавливаем idx? это случайно?
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню