我正在使用keras的预训练模型,并且在尝试获得预测时出现了错误。我在flask服务器中有以下代码:
from NeuralNetwork import *
@app.route("/uploadMultipleImages", methods=["POST"])
def uploadMultipleImages():
uploaded_files = request.files.getlist("file[]")
getPredictionfunction = preTrainedModel["VGG16"]
for file in uploaded_files:
path = os.path.join(STATIC_PATH, file.filename)
result = getPredictionfunction(path)
这就是我在NeuralNetwork.py文件中的内容:
vgg16 = VGG16(weights='imagenet', include_top=True)
def getVGG16Prediction(img_path):
model = vgg16
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
pred = model.predict(x) #ERROR HERE
return sort(decode_predictions(pred, top=3)[0])
preTrainedModel["VGG16"] = getVGG16Prediction
但是,运行以下代码不会产生任何错误:
if __name__ == "__main__":
STATIC_PATH = os.getcwd()+"/static"
print(preTrainedModel["VGG16"](STATIC_PATH+"/18.jpg"))
非常感谢任何评论或建议。谢谢。
答案 0 :(得分:2)
考虑到后端设置为张量流。您应该将Keras会话设置为张量流图
from tensorflow import Graph, Session
from keras import backend
model = 'model path'
graph1 = Graph()
with graph1.as_default():
session1 = Session(graph=graph1)
with session1.as_default():
model_1.load_model(model) # depends on your model type
model2 = 'model path2'
graph2 = Graph()
with graph2.as_default():
session2 = Session(graph=graph2)
with session2.as_default():
model_2.load_model(model2) # depends on your model type
并用于预测
K.set_session(session#)
with graph#.as_default():
prediction = model_#.predict(img_data)
答案 1 :(得分:1)
编辑:在部署应用程序时,我在下面写的似乎无法正常工作(我到目前为止只在本地测试)。 app.config中的模型似乎经常加载。 (每次请求?)
巧合的是,昨天我遇到了同样的问题。似乎TensorFlow和Flask的交互之间存在一些问题。不幸的是,我不了解任何一个人的内部真正理解问题,但我可以提供一个帮助我让它工作的黑客。 (注意:我使用的是Python3,但我认为这不会产生任何影响。)
在烧瓶应用程序的全局命名空间中初始化模型时,似乎会出现问题。因此我将模型直接加载到app.config:
app.config.update({"MODEL":VGG16(weights='imagenet', include_top=True)})
# ...
app.config["MODEL"].predict(x)
也许你可以在server.py而不是NeuralNetwork.py中加载模型,并将其与getVGG16Prediction
一起传递给img_path
?