2017-09-24 96 views
2

我使用keras实现了一个分类程序。我有一大套图像,我想用for循环预测每个图像。keras预测内存交换无限期增加

但是,每次计算新图像时,交换内存都会增加。我试图删除预测函数内的所有变量(并且我确信它在这个函数内部存在问题),但内存仍然增加。

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

和相应的功能:

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

每次进行预测时,您似乎都在构建新模型。你确定你想要吗? –

回答

2

如果您正在使用TensorFlow后端,你将建立每个IMG的模型在for循环。 TensorFlow只是将图形附加到图形等上,这意味着内存只是上升。这是一个众所周知的事件,必须在超参数优化期间处理,当您要构建多个模型时,还需要在此处进行处理。

from keras import backend as K 

,并把这个在年底预测():

K.clear_session() 

或者你也可以建立一个模型,并且把这个作为输入预测功能,这样你就不会建立每个新时间。