Keras模型(Tensorflow Backend)部署到Flask与Django不兼容问题解决方案

本文解决了在Keras模型(TensorFlow后端)部署到Django时遇到的图形不兼容问题。由于Django会清理Keras静态图的内存,导致错误。解决方案是通过手动创建Tensorflow图形上下文,确保模型创建在同一图形环境中,避免ValueError。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题叙述
Keras模型部署在云上,
按照正常方法是把model实例化在类初始化之处,这样可以避免如下错误:
ValueError: Tensor Tensor(“xxx:0”, shape=(), dtype=float32) is not an element of this graph.
正常写法如下:

from keras.models import load_model

class Pikachu():
    def __init__(self, path):
        # load model to memory
        self.model = load_model(path)

    def inference(self, input):
        # run model
        return self.model.predict(x=input)


pikachu = Pikachu('your model path.h5')
pikachu.inference('your image')

这样写的好处是只需要一次把model文件载入到keras并带入后端Tensorflow的静态图中,
直到程序结束前都可以直接访问静态图无需别的操作了。
但是这样会报如下错误:
Tensor(“Placeholder:0”, shape=(x), dtype=int32) must be from the same graph as Tensor(“Variable:0”, shape=(x), dtype=float32).
分析原因,Tensorflow和Django存在冲突,Django会把一开始我们声明的Keras后端静态图的内存清理,
所以后来输入静态图时Keras会临时声明一个空静态图,与之前类初始化时创建好的静态图不同。
解决方法,我们不使用Keras默认声明静态图,而是自己主动声明静态图通道,
这样Keras会把模型图创建在我们声明的静态图中,Django此时不会更改主动声明的静态图内存。
代码如下:

from keras.models import load_model
import tensorflow as tf

class Pikachu():
    def __init__(self, path):
        # init backend graph
        self._GRAPH_ = tf.get_default_graph()
        # load model to memory
        self.model = load_model(path)

    def inference(self, input):
        # run model
        with self._GRAPH_.as_default():
            output = self.model.predict(x=input)
        return output


pikachu = Pikachu('your model path.h5')
pikachu.inference('your image')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值