Las keras predicen un aumento indefinido del intercambio de memoria.

Implementé un progtwig de clasificación utilizando keras. Tengo un gran conjunto de imágenes y me gustaría predecir cada imagen utilizando un bucle for.

Sin embargo, cada vez que se calcula una nueva imagen, aumenta la memoria de intercambio. Intenté eliminar todas las variables dentro de la función de predicción (y estoy seguro de que hay un problema dentro de esta función) pero la memoria sigue aumentando.

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

y la función correspondiente:

 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 

Si está utilizando el backend TensorFlow, estará construyendo un modelo para cada img en el bucle for. TensorFlow simplemente sigue agregando el gráfico al gráfico, etc., lo que significa que la memoria simplemente aumenta. Este es un caso bien conocido y debe tratarse durante la optimización del hiperparámetro cuando va a construir muchos modelos, pero también aquí.

 from keras import backend as K 

y pon esto al final de predict ():

 K.clear_session() 

O simplemente puede crear un modelo y alimentarlo como entrada a la función de predicción para que no esté creando uno nuevo cada vez.