2017-09-24 5 views
2

Ich habe ein Klassifizierungsprogramm mit Keras implementiert. Ich habe eine große Menge von Bildern und möchte jedes Bild mit einer For-Schleife vorhersagen.Keras vorherzusagen Speicherwechsel unbegrenzt

Jedes Mal, wenn ein neues Bild berechnet wird, erhöht sich der Swap-Speicher. Ich habe versucht, alle Variablen innerhalb der Vorhersagefunktion zu löschen (und ich bin sicher, dass es innerhalb dieser Funktion ist, dass es ein Problem gibt), aber der Speicher erhöht sich immer noch.

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

und die entsprechende Funktion:

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

Sie scheinen jedes Mal ein neues Modell zu bauen, wenn eine Vorhersage gemacht wird. Bist du sicher, dass du das willst? –

Antwort

2

Wenn Sie TensorFlow Backend verwenden, werden Sie für jedes img ein Modell für die Schleife in das Gebäude werden. TensorFlow fügt Graphen immer nur graphisch usw. hinzu, was bedeutet, dass der Speicher einfach ansteigt. Dies ist ein bekanntes Ereignis und muss bei der Optimierung von Hyperparametern behandelt werden, wenn Sie viele Modelle erstellen, aber auch hier.

from keras import backend as K 

und setzen diese am Ende des vorhersagen():

K.clear_session() 

Oder Sie können nur ein Modell bauen und Futtermittel, die als Eingabe für die Funktion vorhersagen, so dass Sie nicht ein neues Gebäude gegen Zeit.