2017-09-24 1 views
2

J'ai mis en œuvre un programme de classification en utilisant keras. J'ai un grand nombre d'images et je voudrais prédire chaque image en utilisant une boucle for. Cependant, à chaque fois qu'une nouvelle image est calculée, la mémoire d'échange augmente. J'ai essayé de supprimer toutes les variables à l'intérieur de la fonction de prédiction (et je suis sûr que c'est à l'intérieur de cette fonction qu'il y a un problème) mais la mémoire augmente encore.keras prédire l'augmentation de l'échange de mémoire indéfiniment

for img in images: 
    predict(img, model, categ_par, gl_par) 

et la fonction correspondante:

def predict(image_path, model, categ_par, gl_par): 
    print("[INFO] loading and preprocessing image...") 

    orig = cv2.imread(image_path) 

    image = load_img(image_path, target_size=(gl_par.img_width, gl_par.img_height)) 
    image = img_to_array(image) 

    # important! otherwise the predictions will be '0' 
    image = image/255 

    image = np.expand_dims(image, axis=0) 

    # build the VGG16 network 
    if(categ_par.method == 'VGG16'): 
     model = applications.VGG16(include_top=False, weights='imagenet') 

    if(categ_par.method == 'InceptionV3'): 
     model = applications.InceptionV3(include_top=False, weights='imagenet') 

    # get the bottleneck prediction from the pre-trained VGG16 model 
    bottleneck_prediction = model.predict(image) 

    # build top model 
    model = Sequential() 
    model.add(Flatten(input_shape=bottleneck_prediction.shape[1:])) 
    model.add(Dense(256, activation='relu')) 
    model.add(Dropout(0.5)) 
    model.add(Dense(categ_par.n_class, activation='softmax')) 

    model.load_weights(categ_par.top_model_weights_path) 

    # use the bottleneck prediction on the top model to get the final classification 
    class_predicted = model.predict_classes(bottleneck_prediction) 
    probability_predicted = (model.predict_proba(bottleneck_prediction)) 

    classe = pd.DataFrame(list(zip(categ_par.class_indices.keys(), list(probability_predicted[0])))).\ 
    rename(columns = {0:'type', 1: 'prob'}).reset_index(drop=True) 
    #print(classe) 
    del model 
    del bottleneck_prediction 
    del image 
    del orig 
    del class_predicted 
    del probability_predicted 

    return classe.set_index(['type']).T 
+1

Vous semblez construire un nouveau modèle chaque fois qu'une prédiction est faite. Êtes-vous sûr que vous le voulez? –

Répondre

2

Si vous utilisez backend tensorflow vous allez construire un modèle pour chaque img dans la boucle. TensorFlow ne fait qu'ajouter un graphe sur un graphique, ce qui signifie que la mémoire ne fait qu'augmenter. C'est une occurrence bien connue et doit être traitée pendant l'optimisation d'hyperparameter quand vous construisez beaucoup de modèles, mais également ici.

from keras import backend as K 

et mettre cela à la fin de prédire():

K.clear_session() 

Ou vous pouvez simplement construire un modèle et alimentation qui en entrée à la fonction de prédire si vous n'êtes pas construire un nouveau chaque temps.