ValueError:Tensor'A'必须与Tensor'B'在同一图表中

时间:2017-01-29 22:43:24

标签: flask tensorflow neural-network keras

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

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

2 个答案:

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