2017-01-29 1 views
0

Я использую предварительно подготовленную модель keras, и при вызове ResNet50 (weights = 'imagenet) возникла ошибка. У меня есть следующий код в колбах сервере:ValueError: Тензор 'A' должен быть с того же графика, что и Tensor 'B'

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

однако, ValueError поднимается, когда я называю его из функции колбы POST:

@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) must be from the same graph as Tensor("batchnorm/add_1:0", shape=(?, 112, 112, 64), dtype=float32)

Любые комментарии или предложения очень ценятся. Спасибо.

ответ

1

Проблема здесь в вашей петле. Вы пытаетесь создать новый график на каждой итерации.

Эта линия

model = ResNet50(weights='imagenet') 

Должен быть вызван только один раз. Поэтому либо определите ее как глобальную переменную, либо создайте ее раньше, и передайте ее как параметр getResNet50Prediction()

+0

Благодарим вас за ответ gidim. Я попытался определить его как глобальную переменную, и я получил еще одну ошибку - если бы вы могли посмотреть: http://stackoverflow.com/questions/41991756/valueerror-tensor-is-not-an-element-of-this -граф Спасибо. – matchifang

Смежные вопросы