как использовать несколько генераторов в keras fit_generator()

Вопрос или проблема

Я хочу обучить модель с несколькими входами на наборе изображений. Я использую ImageDataGenerator.flow_from_directory() и fit_generator в keras.

Проблема в том, что я не знаю, как использовать несколько генераторов.

Это мой генератор входных данных и выходных данных, семена одинаковые:

input1 = imageDataGenerator.flow_from_directory(directory=base_data_directory + 'img/' + mode+"https://datascience.stackexchange.com/", **img_generator_config)
input2 = imageDataGenerator.flow_from_directory(directory=base_data_directory + 'edge/' + mode,**edge_generator_config)
output = imageDataGenerator.flow_from_directory(directory=base_data_directory + 'label/' + mode, **label_generator_config)

Как мне использовать fit_generator с этими данными?

На мой взгляд, вам следует создать пользовательский генератор данных или просто использовать функцию fit Keras и сделать ваши входные данные следующим образом:

x = [[image1, feature1], [image2, feature1], [image3, feature1]]

y = [class1, class2, class1]

.

Ответ или решение

Для успешного использования нескольких генераторов данных в Keras с функцией fit_generator(), важно создать собственный генератор, который будет комбинировать данные из нескольких источников. В вашем случае, вы хотите использовать генераторы для изображений, их краевых признаков и меток классов. Давайте рассмотрим, как это можно сделать шаг за шагом.

1. Создание пользовательского генератора

Для начала нам нужно создать класс, который будет наследовать Sequence из библиотеки TensorFlow/Keras. Это позволит нам создать генератор, который будет работать асинхронно и обеспечивать поток данных для обучения.

import numpy as np
from keras.utils import Sequence

class MultiInputGenerator(Sequence):
    def __init__(self, input_gen1, input_gen2, output_gen, batch_size=32):
        self.input_gen1 = input_gen1
        self.input_gen2 = input_gen2
        self.output_gen = output_gen
        self.batch_size = batch_size

    def __len__(self):
        return min(len(self.input_gen1), len(self.input_gen2), len(self.output_gen))

    def __getitem__(self, index):
        # Получаем данные из каждого из генераторов
        input1 = self.input_gen1[index]
        input2 = self.input_gen2[index]
        output = self.output_gen[index]

        # Объединяем входные данные в один массив
        combined_input = [input1[0], input2[0]]  # Предполагается, что возвращаемые данные - (x, y)

        return combined_input, output[0]  # Output возвращает (x, y), используем только y

2. Инициализация генераторов данных

Теперь создадим ваши генераторы:

from keras.preprocessing.image import ImageDataGenerator

image_data_generator = ImageDataGenerator(rescale=1./255)
edge_data_generator = ImageDataGenerator(rescale=1./255)
label_data_generator = ImageDataGenerator()

base_data_directory = '/путь/к/данным/'
mode = 'train/'  # Укажите нужный режим

img_generator_config = {'target_size': (256, 256), 'batch_size': 32, 'class_mode': 'categorical'}
edge_generator_config = {'target_size': (256, 256), 'batch_size': 32, 'class_mode': 'categorical'}
label_generator_config = {'target_size': (256, 256), 'batch_size': 32, 'class_mode': 'categorical'}

input1 = image_data_generator.flow_from_directory(directory=base_data_directory + 'img/' + mode, **img_generator_config)
input2 = edge_data_generator.flow_from_directory(directory=base_data_directory + 'edge/' + mode, **edge_generator_config)
output = label_data_generator.flow_from_directory(directory=base_data_directory + 'label/' + mode, **label_generator_config)

3. Создание экземпляра вашего генератора

Теперь мы создадим экземпляр вашего пользовательского генератора:

batch_size = 32  # Укажите размер батча по вашему усмотрению
multi_input_generator = MultiInputGenerator(input1, input2, output, batch_size)

4. Обучение модели

Теперь, когда у нас есть генератор, мы можем использовать его для обучения вашей модели. Обратите внимание, что fit_generator() устарела в Keras 2.1.5 и теперь рекомендуется использовать fit() с переменной steps_per_epoch.

model.fit(multi_input_generator, 
          steps_per_epoch=len(multi_input_generator), 
          epochs=50)

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...