keras+tornado多次加载model时的bug

刚好今天整理了下这个bug的解决办法,如果后续有人碰到同类型bug可以参考下.BUGkeras+tornado多次加载model时会出现bug:…

我来晚了!

昨天碰到一个bug,直到今天中午才调出来,所以昨晚没来得及准备公众号今天中午要发的素材。刚好今天整理了下这个bug的解决办法,如果后续有人碰到同类型bug可以参考下。

BUG

keras+tornado多次加载model时会出现bug:

raise ValueError("Tensor %s is not an element of this graph." % obj)
TypeError: Cannot interpret feed_dict key as Tensor:
Tensor Tensor(“Placeholde r:0”, shape=(3, 3, 3, 10),dtype=float32) is not an element of this graph.

原因

百度网友答案时,发现这个bug发生的原因有这么几种说法:

  • 多线程加载模型

在调用keras的tensorflow的应用程序中,保证tensorflow的模型是单线程加载的。如果多线程加载模型的话,可能需要人为指定不同的Graph,具体还没有研究。

  • tensorflow的session中还有数据

反正就是一句话,这个bug是keras自身的bug。

解决办法

  • load模型之前,加上一行:keras.backend.clear_session()。

但是,这种做法会导致每次调用predict函数时都要重新加载一次模型,特别耗时。尽管能解决问题,但是不推荐这么做。

示例:

import osimport numpy as npfrom imp import reloadfrom PIL import Image, ImageOpsfrom keras.layers import Inputfrom keras.models import Modeldef predict(img):    keras.backend.clear_session()    #导入模型    input = Input(shape=(32, None, 1), name='the_input')    y_pred= densenet.dense_cnn(input, nclass)    basemodel = Model(inputs=input, outputs=y_pred)    modelPath = os.path.join(os.getcwd(), 'densenet/models/weights_densenet.h5')    if os.path.exists(modelPath):        basemodel.load_weights(modelPath)    width, height = img.size[0], img.size[1]    scale = height * 1.0 / 32    width = int(width / scale)    img = img.resize([width, 32], Image.ANTIALIAS)    img = np.array(img).astype(np.float32) / 255.0 - 0.5    X = img.reshape([1, 32, width, 1])    y_pred = basemodel.predict(X)    y_pred = y_pred[:, :, :]    # out = K.get_value(K.ctc_decode(y_pred, input_length=np.ones(y_pred.shape[0]) * y_pred.shape[1])[0][0])[:, :]    # out = u''.join([characters[x] for x in out[0]])    out = decode(y_pred)    return out
  • 在初始化加载模型之后,根据对象大小(如图片大小)随便生成一个向量让 model 执行一次 predict 函数。

import osimport numpy as npfrom imp import reloadfrom PIL import Image, ImageOpsfrom keras.layers import Inputfrom keras.models import Model#导入模型input = Input(shape=(32, None, 1), name='the_input')y_pred= densenet.dense_cnn(input, nclass)basemodel = Model(inputs=input, outputs=y_pred)modelPath = os.path.join(os.getcwd(), 'densenet/models/weights_densenet.h5')if os.path.exists(modelPath):    basemodel.load_weights(modelPath)    #根据对象大小(如图片大小)随便生成一个向量让 model 执行一次 predict 函数。    basemodel.predict(np.array(np.zeros([1,32,500,1])))def predict(img):    width, height = img.size[0], img.size[1]    scale = height * 1.0 / 32    width = int(width / scale)    img = img.resize([width, 32], Image.ANTIALIAS)    img = np.array(img).astype(np.float32) / 255.0 - 0.5    X = img.reshape([1, 32, width, 1])    y_pred = basemodel.predict(X)    y_pred = y_pred[:, :, :]    # out = K.get_value(K.ctc_decode(y_pred, input_length=np.ones(y_pred.shape[0]) * y_pred.shape[1])[0][0])[:, :]    # out = u''.join([characters[x] for x in out[0]])    out = decode(y_pred)    return out

写在后面的话

参考

(写在后面的话是空的?那就对了,因为我服气,对这个bug表示无语。害我这几个月以来第一次加班,昨晚11点才到家。)

1、Keras+Django多次加载model出现错误

https://blog.csdn.net/qq_34739497/article/details/80792650

2、keras框架 反复调用model 模型 出错

https://blog.csdn.net/lhs960124/article/details/79028691

3、flask项目中调用keras神经网络模型的一个坑

https://blog.csdn.net/leon_wzm/article/details/78434432

发表评论

电子邮件地址不会被公开。 必填项已用*标注