keras 无法多次调用 model.predict_classes

keras unable to call model.predict_classes for multiple times

def predictOne(imgPath):

    model = load_model("withImageMagic.h5")
    image = read_image(imgPath)
    test_sample = preprocess(image)
    predicted_class = model.predict_classes(([test_sample]))
    return predicted_class

我已经训练了一个模型。在此函数中,我加载模型、读取新图像、进行一些预处理并最终预测其标签。

当我运行我的main.py文件时,这个函数被调用,一切顺利。然而,几秒钟后,将使用另一张图片再次调用此函数,我收到此错误:

'Cannot interpret feed_dict key as Tensor: ' + e.args[0])

TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("Placeholder:0", shape=(5, 5, 1, 32), dtype=float32) is not an element of this graph.

很奇怪,这个功能只在第一次使用。我测试了多张图片并得到了相同的行为。

Windows 10 - 带 keras 的 tensorflow-gpu

尝试从函数外部的文件加载模型,并将模型对象作为参数传递给函数 def predictOne(imgPath, model)。这也会快得多,因为每次需要预测时不需要从磁盘加载权重。

如果你想在函数内继续加载模型,导入后端:

from keras import backend as K

然后

K.clear_session() 

加载模型之前。

class one_model:
    session = None
    graph = None 
    loadModel = None
    __instance = None
    @staticmethod
    def getInstance(modelPath):
        """ Static access method. """
        if one_model.__instance == None:
            one_model.__instance = one_model(modelPath)
        return one_model.__instance
        
    def __init__(self, modelPath):
        self.modelPath = modelPath
        self.session = tf.Session(graph=tf.Graph())
        self.loadOneModel()
            
    def loadOneModel(self):
        try:
            with self.session.graph.as_default():
                K.set_session(self.session)
                self.loadModel = keras.models.load_model(self.modelPath)               
        except Exception as e:
            logging.error(str(e))
            print(str(e))
                        
    def getPredictionOne(self, input_file_path): 
        #Predict the data once the model is loaded
        if self.loadModel is not None and self.session is not None: 
            try:
                image = load_img(input_file_path, target_size=inputShape)
                image = img_to_array(image)
                image = np.expand_dims(image, axis=0)
                image = preprocess(image)
                with self.session.graph.as_default():
                    K.set_session(self.session)
                    preds = self.loadModel.predict(image)
                    return preds
            except Exception as e:
                logging.error(str(e))
        
        return -1


if __name__== "__main__": 
    #First Model 
    data = web.input()
        fileapth = data.imagefilepath  
        modelfilepath = data.modelfilepath
        one_modelObj = one_model.getInstance(modelfilepath)        
        value = one_modelObj.getPredictionOne(fileapth)