Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ValueError: Tensor 'A' must be from the same graph as Tensor 'B'

I am using keras' pre-trained model and the error came up when calling ResNet50(weights='imagenet'). I have the following code in flask server:

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]

when calling in in main, it works fine

if __name__ == "__main__":
    STATIC_PATH = os.getcwd()+"/static"
    print(getVGG16Prediction(STATIC_PATH+"/18.jpg"))
    print(getResNet50Prediction(STATIC_PATH+"/18.jpg"))

however, the ValueError rises when I call it from the flask POST function:

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

The full error is as follow:

ValueError: Tensor("cond/pred_id:0", dtype=bool) must be from the same graph as Tensor("batchnorm/add_1:0", shape=(?, 112, 112, 64), dtype=float32)

Any comment or suggestion is highly appreciated. Thank you.

like image 357
matchifang Avatar asked Jan 04 '23 15:01

matchifang


1 Answers

you'll need open different session and specify which graph goes with each session, else Keras will replace each graph as default.

from tensorflow import Graph, Session, load_model
from Keras import backend as K

Loading the graphs:

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)

Predicting/Using the graphs:

K.set_session(session1)
    with graph1.as_default():
        result = model.predict(data)
like image 50
Megan Hardy Avatar answered Jan 14 '23 14:01

Megan Hardy