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)
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)