flask中调用tensorflow,keras深度模型的坑!

本机调试一切都好用,但是部署到服务器上就报错,

# 上传文件
@app.route('/up_photo', methods=['POST'], strict_slashes=False)
def api_upload():
    file_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER'])
    if not os.path.exists(file_dir):
        os.makedirs(file_dir)
    f = request.files['photo']
    if f and allowed_file(f.filename):
        fname = secure_filename(f.filename)

        ext = fname.rsplit('.', 1)[1]
        timestamp = time.time()
        timestruct = time.localtime(timestamp)
        ip = request.remote_addr
        timeID=time.strftime('%Y-%m-%d %H_%M_%S', timestruct)
        new_filename = timeID +"_"+ip+ '.' + ext
        f.save(os.path.join(file_dir, new_filename))

        img = image.load_img(os.path.join(file_dir, new_filename), target_size=(299, 299))
        x = image.img_to_array(img)
        x = np.expand_dims(x, axis=0)
        x = preprocess_input(x)
        .....
        output_data = model.predict(x)
        .....

        newhtml = newhtml.replace("theImageDiscription", str(objinfor))
        response = make_response(newhtml)
        response.headers['Access-Control-Allow-Headers'] = 'Content-Type,Origin'
        response.headers['Access-Control-Allow-Origin'] = '*'
        response.headers['Access-Control-Allow-Methods'] = 'POST,GET,OPTIONS'
        return newhtml

        #return jsonify({"success": 0, "msg": "上传成功"})
    else:
        return jsonify({"error": 1001, "msg": "上传失败"})
if __name__ == '__main__': 
    app.config['JSON_AS_ASCII'] = False 
    labels = load_labels("../models/retrained_labels_Chn.txt")
    model = InceptionResNetV2(weights='../models/inception_resnet_v2_weights_tf_dim_ordering_tf_kernels.h5') 
    app.run(host='0.0.0.0', port=5000,debug=False, threaded=True )

出了如下的错

ValueError: Tensor Tensor("predictions/Softmax:0", shape=(?, 1000), dtype=float32) is not an element of this graph.

如果在究其原因是使用了动态图,没有固定,方法一在main中随意找张图调用一次model.predict(x)实例,但这样代码不好看

方法二.加global graph, model

if __name__ == '__main__':
    orihtml = open('uploadImg_local.html', encoding='utf-8').read()

    # 定义全局图,不然在flask中调用报错,因数tf是动态图,还有一种方法是先实际运行一下预测,之后就好用了,但是代码不好看

    app.config['JSON_AS_ASCII'] = False
    global graph, model
    graph = tf.get_default_graph()
    labels = load_labels("../models/retrained_labels_Chn.txt")
    model = InceptionResNetV2(weights='../models/inception_resnet_v2_weights_tf_dim_ordering_tf_kernels.h5')

    app.run(host='0.0.0.0', port=5000,debug=False, threaded=True )

 

在model.predict(x)之前加上with 语句,问题得以解决,主要是将动态图固定。

with graph.as_default():
    output_data = model.predict(x)

另外前几天又出现了这个问题,代码是一样的,在一台机器上好用,在另外一台机器上不好用,发现原因是keras安成了2.3.0更新到2.3.1就正常了,浪费我一天时间。。。

另外如果用量不大可以

threaded=False就OK了,自己用没事的。

 

另外上面的代码如果在linux系统下不好用,可能是因为session的原因

将原来的graph = tf.get_default_graph()改为下面的

sess = tf.Session(graph=tf.Graph())
with sess.graph.as_default():
    keras.backend.set_session(sess)

,另外在调用处改为如下:

with sess.graph.as_default():
    keras.backend.set_session(sess)
    output_data = model.predict(x)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值