我正在使用keras的预训练模型,并在调用ResNet50时出现错误(权重='imagenet')。 我在flask服务器中有以下代码:
def getVGG16Prediction(img_path):
model = VGG16(weights='imagenet', include_top=True)
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)
return sort(decode_predictions(pred, top=3)[0])
def getResNet50Prediction(img_path):
model = ResNet50(weights='imagenet') #ERROR HERE
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)
preds = model.predict(x)
return decode_predictions(preds, top=3)[0]
在主要中调用时,它可以正常工作
if __name__ == "__main__":
STATIC_PATH = os.getcwd()+"/static"
print(getVGG16Prediction(STATIC_PATH+"/18.jpg"))
print(getResNet50Prediction(STATIC_PATH+"/18.jpg"))
然而,当我从烧瓶POST函数中调用它时,ValueError会上升:
@app.route("/uploadMultipleImages", methods=["POST"])
def uploadMultipleImages():
uploaded_files = request.files.getlist("file[]")
weight = request.form.get("weight")
for file in uploaded_files:
path = os.path.join(STATIC_PATH, file.filename)
file.save(os.path.join(STATIC_PATH, file.filename))
result = getResNet50Prediction(path)
完整错误如下:
ValueError:Tensor(“cond / pred_id:0”,dtype = bool)必须来自同一个 图为Tensor(“batchnorm / add_1:0”,shape =(?,112,112,64), D型= FLOAT32)
任何评论或建议都非常感谢。谢谢。
答案 0 :(得分:5)
您需要打开不同的会话,并指定每个会话应包含哪个图,否则Keras将默认替换每个图。
from tensorflow import Graph, Session, load_model
from Keras import backend as K
加载图形:
graph1 = Graph()
with graph1.as_default():
session1 = Session()
with session1.as_default():
model = load_model(foo.h5)
graph2 = Graph()
with graph2.as_default():
session2 = Session()
with session2.as_default():
model2 = load_model(foo2.h5)
预测/使用图形:
K.set_session(session1)
with graph1.as_default():
result = model.predict(data)
答案 1 :(得分:2)
这里的问题是你的循环。您尝试在每次迭代中生成新图表。
这一行
model = ResNet50(weights='imagenet')
只应调用一次。因此,要么将其定义为全局变量,要么先创建它并将其作为参数传递给getResNet50Prediction()