ValueError:Tensor :( ...)不是此图的元素

时间:2017-02-01 23:26:57

标签: python-2.7 neural-network keras conv-neural-network keras-layer

我正在使用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"))

这是完整的错误: enter image description here

非常感谢任何评论或建议。谢谢。

2 个答案:

答案 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