Как обучить модель Keras с использованием Functional API, который имеет два входа и два выхода и использует два метода ImageDataGenerator (flow_from_directory) - PullRequest
1 голос
/ 18 октября 2019

Я хочу создать модель с использованием API-интерфейса Functional Keras, который будет иметь два входа и два выхода. Модель будет использовать два экземпляра метода ImageDataGenerator.flow_from_directory() для получения изображений из двух разных каталогов (входы1 и входы2 соответственно).

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

Мой вопрос, как обучить такую ​​модель. Вот некоторый игрушечный код:

# Define our example directories and files
train_dir1 ='...\\cats_v_dogs_sample_training1'

train_dir2 = '...\\cats_v_dogs_sample_training2'

# Add our data-augmentation parameters to ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255.,
                                   rotation_range = 40,
                                   width_shift_range = 0.2,
                                   height_shift_range = 0.2,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

# Flow training images in batches of 1 using train_datagen generator: inputs1
train_generator1 = train_datagen.flow_from_directory(train_dir1,
                                                    batch_size = 1,
                                                    class_mode = 'binary', 
                                                    target_size = (150, 150), shuffle = False)     

# Flow training images in batches of 1 using train_datagen generator: inputs2
train_generator2 = train_datagen.flow_from_directory(train_dir2,
                                                    batch_size = 1,
                                                    class_mode = 'binary', 
                                                    target_size = (150, 150), shuffle = False)     

imgs1 = []
imgs2 = []

def f_lambda1(x):

    imgs1.append(x)

    return(x)



def f_lambda2(x):

    imgs2.append(x)

    return(x)



# This returns a tensor
inputs1 = Input(shape=(150, 150, 3))
inputs2 = Input(shape=(150, 150, 3))

l1 = Lambda(f_lambda1, name = 'lambda1')(inputs1)
l2 = Lambda(f_lambda2 , name = 'lambda2')(inputs2)

x1 = Flatten()(inputs1)

x1 = Dense(1024, activation='relu')(x1)

x1 = Dropout(0.2)(x1)  

outputs1 = Dense(1, activation='sigmoid')(x1)    


x2 = Flatten()(inputs1)

x2 = Dense(1024, activation='relu')(x2)

x2 = Dropout(0.2)(x2)  

outputs2 = Dense(1, activation='sigmoid')(x2)    

model.compile()

# Train model on dataset -- The problem is that I have two not one training_generator, so the code below will not work

model.fit_generator(generator=training_generator,
                    validation_data=validation_generator,
                    use_multiprocessing=True,
                    workers=6)

1 Ответ

1 голос
/ 18 октября 2019

Создать объединенный генератор.

В этом примере оба генератора поездов должны иметь одинаковую длину:

class JoinedGenerator(keras.utils.Sequence):
    def __init__(self, generator1, generator2)
        self.generator1 = generator1
        self.generator2 = generator2 

    def __len__(self):
        return len(self.generator1)

    def __getitem__(self, i):
        x1, y1 = self.generator1[i]
        x2, y2 = self.generator2[i]
        return [x1, x2], [y1, y2]

    def on_epoch_end(self):
        self.generator1.on_epoch_end()
        self.generator2.on_epoch_end()

Будьте осторожны: вам, вероятно, понадобится shuffle=False в двух генераторах, чтобы ваши данные не смешивались(если это не проблема)

Используйте это как:

training_generator = JoinedGenerator(train_generator1, train_generator2)

И вы забыли определить свою модель:

model = Model([inputs1, inputs2], [outputs1, outputs2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...