web-dev-qa-db-fra.com

Keras: Comment utiliser fit_generator avec plusieurs entrées

Est-il possible d'avoir deux fit_generator?

Je crée un modèle avec deux entrées, la configuration du modèle est illustrée ci-dessous.

enter image description here

L'étiquette Y utilise le même étiquetage pour les données X1 et X2.

L'erreur suivante continuera de se produire.

Erreur lors de la vérification de l'entrée du modèle: la liste des tableaux Numpy que vous transmettez à votre modèle n'est pas la taille attendue par le modèle. Devrait voir 2 baie (s), mais a obtenu à la place la liste suivante de 1 baies: [baie ([[[[0,75686276, 0,75686276, 0,75686276], [0,75686276, 0,75686276, 0,75686276], [0,75686276, 0,75686276, 0,75686276]. .., [0,65882355, 0,65882355, 0,65882355 ...

Mon code ressemble à ceci:

def generator_two_img(X1, X2, Y,batch_size):
    generator = ImageDataGenerator(rotation_range=15,
                                   width_shift_range=0.2,
                                   height_shift_range=0.2,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   horizontal_flip=True,
                                   fill_mode='nearest')

    genX1 = generator.flow(X1, Y, batch_size=batch_size)
    genX2 = generator.flow(X2, Y, batch_size=batch_size)

    while True:
        X1 = genX1.__next__()
        X2 = genX2.__next__()
        yield [X1, X2], Y
  """
      .................................
  """
hist = model.fit_generator(generator_two_img(x_train, x_train_landmark, 
                y_train, batch_size),
                steps_per_Epoch=len(x_train) // batch_size, epochs=nb_Epoch,
                callbacks = callbacks,
                validation_data=(x_validation, y_validation),
                validation_steps=x_validation.shape[0] // batch_size, 
                `enter code here`verbose=1)
13
김태형

Essayez ce générateur:

def generator_two_img(X1, X2, y, batch_size):
    genX1 = gen.flow(X1, y,  batch_size=batch_size, seed=1)
    genX2 = gen.flow(X2, y, batch_size=batch_size, seed=1)
    while True:
        X1i = genX1.next()
        X2i = genX2.next()
        yield [X1i[0], X2i[0]], X1i[1]

MODIFIER après le commentaire de Thanh Nguyen

Générateur pour 3 entrées:

def generator_three_img(X1, X2, X3, y, batch_size):
    genX1 = gen.flow(X1, y,  batch_size=batch_size, seed=1)
    genX2 = gen.flow(X2, y, batch_size=batch_size, seed=1)
    genX3 = gen.flow(X3, y, batch_size=batch_size, seed=1)
    while True:
        X1i = genX1.next()
        X2i = genX2.next()
        X3i = genX3.next()
        yield [X1i[0], X2i[0], X3i[0]], X1i[1]
13
Ioannis Nasios

J'ai une implémentation pour plusieurs entrées pour TimeseriesGenerator que je l'ai adaptée (je n'ai malheureusement pas pu la tester) pour répondre à cet exemple avec ImageDataGenerator. Mon approche consistait à construire une classe wrapper pour les multiples générateurs à partir de keras.utils.Sequence Puis à implémenter ses méthodes de base: __len__ Et __getitem__:

from keras.preprocessing.image import ImageDataGenerator
from keras.utils import Sequence


class MultipleInputGenerator(Sequence):
    """Wrapper of 2 ImageDataGenerator"""

    def __init__(self, X1, X2, Y, batch_size):
        # Keras generator
        self.generator = ImageDataGenerator(rotation_range=15, 
                                            width_shift_range=0.2,
                                            height_shift_range=0.2,
                                            shear_range=0.2,
                                            zoom_range=0.2,
                                            horizontal_flip=True, 
                                            fill_mode='nearest')

        # Real time multiple input data augmentation
        self.genX1 = self.generator.flow(X1, Y, batch_size=batch_size)
        self.genX2 = self.generator.flow(X2, Y, batch_size=batch_size)

    def __len__(self):
        """It is mandatory to implement it on Keras Sequence"""
        return self.genX1.__len__()

    def __getitem__(self, index):
        """Getting items from the 2 generators and packing them"""
        X1_batch, Y_batch = self.genX1.__getitem__(index)
        X2_batch, Y_batch = self.genX2.__getitem__(index)

        X_batch = [X1_batch, X2_batch]

        return X_batch, Y_batch

Vous pouvez utiliser ce générateur avec model.fit_generator() une fois le générateur instancié.

2
JVGD