因為工作需要国撵,同一個進程會使用到兩個Keras Model, 我是通過寫了一個KerasUtil類,然后創(chuàng)建了多個此類對象,以加載不同的Model:
kerasutil_merge = KerasUtil(rawtextpath=r'va_new/model/rawcontent/vamergebinary.csv',
lstmmodelpath=r'va_new/model/vamergebinarybilstm.h5',
modeltype='bilstm')
kerasutil_added = KerasUtil(rawtextpath=r'va_new/model/rawcontent/vaaddedbinary.csv',
lstmmodelpath=r'va_new/model/vaaddedbinarybilstm.h5',
modeltype='bilstm')
但是在運行的時候遇到問題了,如果兩個model同時加載,并做predict的嘗試右遭,那么就發(fā)生疑似多model加載導致的issue:
Tensor embedding_2_input:0, specified in either feed_devices or fetch_devices was not found in the Graph
Exception ignored in: <bound method BaseSession._Callable.del of <tensorflow.python.client.session.BaseSession._Callable object at 0x000001B47CA91240>>
Traceback (most recent call last):
File "D:\python36\lib\site-packages\tensorflow\python\client\session.py", line 1398, in del
self._session._session, self._handle, status)
File "D:\python36\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 519, in exit
c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: No such callable handle: 1875572934464
一開始看到這個是慌張的做盅,因為之前僅僅使用一個model的時候,是沒有問題的窘哈,只是Flask提供Web API加載遇到了一些問題(請見我另一篇簡書)
仔細想了想吹榴,應該是底層的Tensorflow在處理多Model切換時,懵逼了滚婉,是否每次predict的時候图筹,遇到異常就嘗試重新load呢?
代碼修復的嘗試如下:
def predictcategory(self, sentence, threshold=0.5):
self.initialforlstm()
cleantext = gensimutil.cleardatafordoc2vector(sentence)
twt = [cleantext]
twt = self.tokenizer.texts_to_sequences(twt)
# padding the tweet to have exactly the same shape as `embedding_2` input
twt = pad_sequences(twt, maxlen=80, dtype='int32', value=0)
# To avoid below exception:Tensor embedding_1_input:0,
# specified in either feed_devices or fetch_devices was not found in the Graph
try:
categoryresult = self.lstmmodel.predict(twt, batch_size=1, verbose=2)[0]
except Exception as e:
logger.info(e)
keras.backend.clear_session()
self.lstmmodel = load_model(self.modelpath)
categoryresult = self.lstmmodel.predict(twt, batch_size=1, verbose=2)[0]
logger.info('raw sentence: {0}'.format(sentence))
boolDict = {0: 'Negative', 1: 'Positive'}
if len(categoryresult) > 2:
logger.info('category is {0}, similarity: {1}'.format(self.categorydict[np.argmax(categoryresult)+1],
categoryresult[np.argmax(categoryresult)]))
result = {'categorycode': np.argmax(categoryresult) + 1,
'categoryname': self.categorydict[np.argmax(categoryresult)+1],
'similarity': categoryresult[np.argmax(categoryresult)]}
else:
result = 0
if np.argmax(categoryresult) == 1 and categoryresult[np.argmax(categoryresult)] > threshold:
result = 1
logger.info('category is {0}, similarity: {1}'.format(boolDict[result],
categoryresult[result]))
result = {'categorycode': result,
'categoryname': boolDict[result],
'similarity': categoryresult[result]}
return result
其中让腹,這個是關(guān)鍵远剩,即蒙圈了,就重新加載模型骇窍,效率或許低了些瓜晤,但能夠讓程序run下去
try:
categoryresult = self.lstmmodel.predict(twt, batch_size=1, verbose=2)[0]
except Exception as e:
logger.info(e)
keras.backend.clear_session()
self.lstmmodel = load_model(self.modelpath)
categoryresult = self.lstmmodel.predict(twt, batch_size=1, verbose=2)[0]