2
votes

Comment combiner les modèles LSTM et CNN dans Keras

J'ai des utilisateurs avec des photos de profil et des données chronologiques (événements générés par ces utilisateurs). Pour faire une classification binaire, j'ai écrit deux modèles: LSTM et CNN qui fonctionnent bien indépendamment. Mais ce que je veux vraiment, c'est concaténer ces modèles.

Voici mon modèle LSTM:

checkpoint_name = './keras_img_checkpoint/img_model'
callbacks = [ModelCheckpoint(checkpoint_name, save_best_only=True)]

img_model = gen_img_model((75,75,3))

# batch size for img model
batch_size = 200

train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

val_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)


# train gen for img model
train_generator = train_datagen.flow_from_directory(
        './dataset/train/',
        target_size=(75, 75),
        batch_size=batch_size,
        class_mode='binary')

val_generator = val_datagen.flow_from_directory(
        './dataset/val/', 
        target_size=(75, 75),
        batch_size=batch_size,
        class_mode='binary')


STEP_SIZE_TRAIN = train_generator.n // train_generator.batch_size
STEP_SIZE_VAL = val_generator.n // val_generator.batch_size

img_model.fit_generator(
        train_generator,
        steps_per_epoch=STEP_SIZE_TRAIN,
        validation_data=val_generator,
        validation_steps=800 // batch_size,
        epochs=1,
        verbose=1,
        callbacks=callbacks
)

Modèle CNN:

def gen_img_model(input_dim=(75,75,3)):
    input = Input(shape=input_dim)

    conv = Conv2D(32, kernel_size=(3,3), activation='relu')(input)
    conv = MaxPooling2D((3,3))(conv)
    conv = Dropout(0.2)(conv)

    conv = BatchNormalization()(conv)


    dense = Dense(128, activation='relu', name='img_features')(conv)
    dense = Dropout(0.2)(dense)

    output = Dense(1, activation='sigmoid')(dense)

    optimizer = RMSprop(lr=1e-3, decay=0.0)

    model = Model(input, output)
    model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])

    return model


1 commentaires

Comment avez-vous remodelé les formes d'entrée de CNN -> LSTM en utilisant le générateur?


3 Réponses :


-1
votes

Vous pouvez ajouter des couches CNN et LSTM dans un seul modèle, avec Keras. Vous pourriez rencontrer des problèmes avec les formes.

Exemple:

def CNN_LSTM():
    model = Sequential()
    model.add(Convolution2D(input_shape = , filters = , kernel_size = 
    , activation = )
    model.add(LSTM(units = , )

   return model

Il vous suffira d'ajouter vos paramètres. J'espère que cela t'aides.


0 commentaires

0
votes
This is how you can merge two Deep learning models.

    model1 = Sequential()
    #input 
    model1.add(Dense(32, input_shape=(NUM_FEAT1,1)))
    model1.add(Activation("elu"))
    model1.add(Dropout(0.5))
    model1.add(Dense(16))
    model1.add(Activation("elu"))
    model1.add(Dropout(0.25))
    model1.add(Flatten())

    model2 = Sequential()
    #input 
    model2.add(Dense(32, input_shape=(NUM_FEAT1,1)))
    model2.add(Activation("elu"))
    model2.add(Dropout(0.5))
    model2.add(Dense(16))
    model2.add(Activation("elu"))
    model2.add(Dropout(0.25))
    model2.add(Flatten())

merged = Concatenate()([model1.output,model2.output])
z = Dense(128, activation="relu")(merged)
z = Dropout(0.25)(z)
z = Dense(1024, activation="relu")(z)
z = Dense(1, activation="sigmoid")(z)

model = Model(inputs=[model1.input, model2.input], outputs=z)

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])


        model.fit([x_train[train_index][:,:66], x_train[train_index][:,66:132], y_train[train_index], batch_size=100, epochs=100, verbose=2)
By this you are able to feed 2 different types of data to your model like images in first model and Textual Data in the second model according to your need.

2 commentaires

@Sohab, dans mon cas, j'entraîne le modèle CNN avec le générateur (flux depuis le répertoire). Comment peut-il être concaténé dans ce cas?


Je ne l'ai pas essayé pour le générateur mais je vais essayer de vous le faire savoir le week-end



-1
votes

Je ne pense pas que cela réponde exactement à votre question, mais au lieu de faire SEULEMENT cela, vous pouvez envisager d'exécuter des dizaines de modèles ML sur vos ensembles de données et voir lequel fonctionne le mieux. Vous pouvez utiliser AoutML ou DataRobot pour ces tâches.

https://heartbeat.fritz.ai / automl-the-next-wave-of-machine-learning-5494baac615f

https://www.forbes.com/sites/janakirammsv/2018/06/04/datarobot-puts-the-power-of-machine-learning-in- les-mains-des-analystes-métiers / # 5e9586ea4306


0 commentaires