¿Cómo se concatenan dos objetos generadores antes de ajustar el modelo?
Quiero normalizar las imágenes de entrenamiento y validación con un generador, y obtener nuevas imágenes de las vistas de entrenamiento y validación con otro generador. Luego, quiero combinarlos y entrenarlos por separado. ¿Cómo puedo hacer esta operación de fusión? Estoy obteniendo un error.
Valor de error: la capa de modelo espera 1 entrada (s), pero recibió 2 tensores de entrada. Entradas recibidas: [& lt; tf.Tensor ‘IteratorGetNext: 0’ shape = (Ninguno, Ninguno, Ninguno, Ninguno) dtype = float32 & gt ;, & lt; tf.Tensor ‘IteratorGetNext: 1’ shape = (Ninguno, Ninguno, Ninguno, Ninguno) dtype = float32 & gt;]
Rutas de imágenes
train_path = “train/”
valid_path = “valid/”
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import numpy as np
from keras.utils.np_utils import to_categorical
********************ENTRENAMIENTO **************************
train_datagen1 = ImageDataGenerator(rescale=1./255)
train_generator1 = train_datagen1.flow_from_directory(
train_path,
save_to_dir=”train_augm/”,
target_size=(224, 224),
batch_size=6)
train_datagen2 = ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
….)
train_generator2 = train_datagen2.flow_from_directory(
train_path,
target_size=(224, 224),
batch_size=6)
****************** VALIDACIÓN *******************************
validation_datagen1 = ImageDataGenerator(rescale=1./255)
validation_generator1 = validation_datagen1.flow_from_directory(
valid_path,
save_to_dir=”valid_augm/”,
target_size=(224, 224),
batch_size=3)
validation_datagen2 = ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
….)
validation_generator2 = validation_datagen2.flow_from_directory(
valid_path,
target_size=(224, 224),
batch_size=3)
def combine_generator1(gen1, gen2):
while True:
X1i = gen1.next()
X2i = gen2.next()
yield [X1i[0], X2i[0]], X2i[1] #Yield both images and their mutual label
def combine_generator2(gen_v1, gen_v2):
while True:
V1i = gen_v1.next()
V2i = gen_v2.next()
yield [V1i[0], V2i[0]], V2i[1] #Yield both images and their mutual label
train_generator = combine_generator1(train_generator1, train_generator2)
validation_generator = combine_generator2(validation_generator1, validation_generator2)
********************ENTRENANDO EL MODELO *************************
history = new_model.fit(
train_generator,
epochs=5,
validation_data = validation_generator,
shuffle = True,
verbose = 1)
davy.ai
El error se debe a que el modelo espera solo una entrada, pero la combinación del generador proporciona dos entradas. Para resolver este error, puede modificar las funciones de
combine_generator
para fusionar los dos generadores en un solo generador que proporcione una entrada y una salida.Aquí hay un código actualizado que debería funcionar:
En el código actualizado, la función
combine_generator
obtiene un lote de imágenes de cada uno de los dos generadores de entrada, luego concatena los lotes de imágenes a lo largo del primer eje (es decir, el eje de lote) para crear un tensor de entrada de forma(batch_size * 2, height, width, channels)
. La función luego devuelve este tensor de entrada junto con el tensor de etiquetas del segundo generador.Al concatenar los lotes de imágenes de los dos generadores, esencialmente proporcionamos al modelo ambos tipos de imágenes aumentadas en cada lote, lo que nos permite entrenar en ambos tipos de imágenes simultáneamente.