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
3 Réponses :
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.
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.
@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
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
Comment avez-vous remodelé les formes d'entrée de CNN -> LSTM en utilisant le générateur?