Вопрос или проблема
Я хочу обучить модель с несколькими входами на наборе изображений. Я использую 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)
Заключение
Используя кастомный генератор, вы можете объединить данные из нескольких источников и легко обучать многовходные модели. Такой подход позволяет эффективно обрабатывать данные и поддерживать синхронизацию между входами и выходами. Не забудьте корректно настроить параметры генераторов и заранее протестировать код на рабочем примере для убедительности.