specified in either feed_devices or fetch_devices was not found in the Graph

目录

 

Keras模型部署服务中遇到的问题及解决方法

问题:

网上的方法:

解决:


Keras模型部署服务中遇到的问题及解决方法

问题:

问题描述:flask应用调用模型初次是没问题的,但第二次(或多次)请求会报错误Error - Tensor input_1:0, specified in either feed_devices or fetch_devices was not found in the Graph

原因都是graph不一致造成的。也就是web应用初始化和调用不在一个线程,导致出现两个不同的graph。所以改善方法就是在初始化时保存graph,在模型预测时指定graph。

网上的方法:

第二次调用model的时候,model底层tensorflow的session中还有数据。在调用模型之前加上如下命令:

 keras.backend.clear_session()

在这里插入图片描述 

缺点:每次调用预测时都要load_model,耗费了大量的时间。

参考:https://blog.csdn.net/selfimpro_001/article/details/99693273

解决:

import os
import tensorflow as tf
from dpai.public.module_loader import get_gpu_options
from tensorflow.python.keras.backend import set_session
import keras.backend
from keras.models import load_model


class IntentClassifyModel(object):

    def __init__(self):
        self.graph = tf.get_default_graph()
        config = tf.ConfigProto(gpu_options=get_gpu_options())
        self.session = tf.Session(config=config)
        self.model = load_model(default_model_path)

    def __call__(self, sentence):
        with self.graph.as_default():
            set_session(self.session)
            ......(自己的demo)

适用于一个服务运行多个算法服务时:

class IntentClassifyModel(object): 

    def __init__(self): 

        self.graph = tf.get_default_graph() 
        config = tf.ConfigProto() 
        config.gpu_options.allow_growth = True 
        self.session = tf.Session(config=config)
        with self.graph.as_default(): 
            with self.session.as_default(): 
                print('load') 
                self.model = load_model(model_path) 
                print('load done') 
                self.model.summary() 


    def __call__(self, sentence): 
        with self.graph.as_default(): 
            with self.session.as_default(): 
                ......(以下为自己的demo)
                # result = predict(model, x_test, y_test) 
                text = text_process(sentence) 
                y_pred = self.model.predict(text) 
                y_pred = y_pred.argmax(axis=1) 
                for i in y_pred: 
                    label = i 
                return id_label[str(label)] 

参考:

https://blog.csdn.net/weixin_40548136/article/details/106716098

https://blog.csdn.net/Cyril__Li/article/details/79054596

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值