modelFactory.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. '''
  2. Created on 2019年5月16日
  3. @author: User
  4. '''
  5. import os
  6. import sys
  7. sys.path.append(os.path.abspath("../.."))
  8. from keras import models
  9. from keras import layers
  10. from keras_contrib.layers import CRF
  11. from keras.preprocessing.sequence import pad_sequences
  12. from keras import optimizers,losses,metrics
  13. from BiddingKG.dl.common.Utils import *
  14. import tensorflow as tf
  15. class Model_role_classify():
  16. def __init__(self,lazyLoad=getLazyLoad()):
  17. #self.model_role_file = os.path.abspath("../role/models/model_role.model.hdf5")
  18. self.model_role_file = os.path.dirname(__file__)+"/../role/log/new_biLSTM-ep012-loss0.028-val_loss0.040-f10.954.h5"
  19. self.model_role = None
  20. self.graph = tf.get_default_graph()
  21. if not lazyLoad:
  22. self.getModel()
  23. def getModel(self):
  24. if self.model_role is None:
  25. self.model_role = models.load_model(self.model_role_file,custom_objects={'precision':precision,'recall':recall,'f1_score':f1_score})
  26. return self.model_role
  27. def encode(self,tokens,begin_index,end_index,**kwargs):
  28. return embedding(spanWindow(tokens=tokens,begin_index=begin_index,end_index=end_index,size=10),shape=(2,10,128))
  29. def predict(self,x):
  30. x = np.transpose(np.array(x),(1,0,2,3))
  31. with self.graph.as_default():
  32. return self.getModel().predict([x[0],x[1]])
  33. class Model_role_classify_word():
  34. def __init__(self,lazyLoad=getLazyLoad()):
  35. if USE_PAI_EAS:
  36. lazyLoad = True
  37. #self.model_role_file = os.path.abspath("../role/log/ep071-loss0.107-val_loss0.122-f10.956.h5")
  38. self.model_role_file = os.path.dirname(__file__)+"/../role/models/ep038-loss0.140-val_loss0.149-f10.947.h5"
  39. #self.model_role_file = os.path.abspath("../role/log/textcnn_ep017-loss0.088-val_loss0.125-f10.955.h5")
  40. self.model_role = None
  41. self.sess_role = tf.Session(graph=tf.Graph())
  42. if not lazyLoad:
  43. self.getModel()
  44. def getModel(self):
  45. if self.model_role is None:
  46. with self.sess_role.as_default() as sess:
  47. with self.sess_role.graph.as_default():
  48. meta_graph_def = tf.saved_model.loader.load(sess=self.sess_role, tags=["serve"], export_dir=os.path.dirname(__file__)+"/role_savedmodel")
  49. signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
  50. signature_def = meta_graph_def.signature_def
  51. input0 = self.sess_role.graph.get_tensor_by_name(signature_def[signature_key].inputs["input0"].name)
  52. input1 = self.sess_role.graph.get_tensor_by_name(signature_def[signature_key].inputs["input1"].name)
  53. input2 = self.sess_role.graph.get_tensor_by_name(signature_def[signature_key].inputs["input2"].name)
  54. output = self.sess_role.graph.get_tensor_by_name(signature_def[signature_key].outputs["outputs"].name)
  55. self.model_role = [[input0,input1,input2],output]
  56. return self.model_role
  57. '''
  58. def load_weights(self):
  59. model = self.getModel()
  60. model.load_weights(self.model_role_file)
  61. '''
  62. def encode(self,tokens,begin_index,end_index,entity_text,**kwargs):
  63. _span = spanWindow(tokens=tokens,begin_index=begin_index,end_index=end_index,size=12,center_include=True,word_flag=True,text=entity_text)
  64. # print(_span)
  65. _encode_span = encodeInput(_span, word_len=50, word_flag=True,userFool=False)
  66. # print(_encode_span)
  67. return _encode_span
  68. def predict(self,x):
  69. x = np.transpose(np.array(x),(1,0,2))
  70. model_role = self.getModel()
  71. assert len(x)==len(model_role[0])
  72. feed_dict = {}
  73. for _x,_t in zip(x,model_role[0]):
  74. feed_dict[_t] = _x
  75. list_result = limitRun(self.sess_role,[model_role[1]],feed_dict)[0]
  76. return list_result
  77. #return self.sess_role.run(model_role[1],feed_dict=feed_dict)
  78. class Model_money_classify():
  79. def __init__(self,lazyLoad=getLazyLoad()):
  80. if USE_PAI_EAS:
  81. lazyLoad = True
  82. self.model_money_file = os.path.dirname(__file__)+"/../money/models/model_money_word.h5"
  83. self.model_money = None
  84. self.sess_money = tf.Session(graph=tf.Graph())
  85. if not lazyLoad:
  86. self.getModel()
  87. def getModel(self):
  88. if self.model_money is None:
  89. with self.sess_money.as_default() as sess:
  90. with sess.graph.as_default():
  91. meta_graph_def = tf.saved_model.loader.load(sess,tags=["serve"],export_dir=os.path.dirname(__file__)+"/money_savedmodel")
  92. signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
  93. signature_def = meta_graph_def.signature_def
  94. input0 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input0"].name)
  95. input1 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input1"].name)
  96. input2 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input2"].name)
  97. output = sess.graph.get_tensor_by_name(signature_def[signature_key].outputs["outputs"].name)
  98. self.model_money = [[input0,input1,input2],output]
  99. return self.model_money
  100. '''
  101. if self.model_money is None:
  102. self.model_money = models.load_model(self.model_money_file,custom_objects={'precision':precision,'recall':recall,'f1_score':f1_score})
  103. return self.model_money
  104. '''
  105. '''
  106. def load_weights(self):
  107. model = self.getModel()
  108. model.load_weights(self.model_money_file)
  109. '''
  110. def encode(self,tokens,begin_index,end_index,**kwargs):
  111. _span = spanWindow(tokens=tokens, begin_index=begin_index, end_index=end_index, size=10, center_include=True, word_flag=True)
  112. # print(_span)
  113. return encodeInput(_span, word_len=50, word_flag=True,userFool=False)
  114. return embedding_word(_span,shape=(3,100,60))
  115. def predict(self,x):
  116. # print("shape",np.shape(x))
  117. x = np.transpose(np.array(x),(1,0,2))
  118. model_money = self.getModel()
  119. assert len(x)==len(model_money[0])
  120. feed_dict = {}
  121. for _x,_t in zip(x,model_money[0]):
  122. feed_dict[_t] = _x
  123. list_result = limitRun(self.sess_money,[model_money[1]],feed_dict)[0]
  124. #return self.sess_money.run(model_money[1],feed_dict=feed_dict)
  125. return list_result
  126. '''
  127. with self.graph.as_default():
  128. return self.getModel().predict([x[0],x[1],x[2]])
  129. '''
  130. class Model_person_classify():
  131. def __init__(self,lazyLoad=getLazyLoad()):
  132. if USE_PAI_EAS:
  133. lazyLoad = True
  134. self.model_person_file = os.path.dirname(__file__)+"/../person/models/model_person.model.hdf5"
  135. self.model_person = None
  136. self.sess_person = tf.Session(graph=tf.Graph())
  137. if not lazyLoad:
  138. self.getModel()
  139. def getModel(self):
  140. if self.model_person is None:
  141. with self.sess_person.as_default() as sess:
  142. with sess.graph.as_default():
  143. meta_graph_def = tf.saved_model.loader.load(sess,tags=["serve"],export_dir=os.path.dirname(__file__)+"/person_savedmodel_new")
  144. signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
  145. signature_def = meta_graph_def.signature_def
  146. input0 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input0"].name)
  147. input1 = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["input1"].name)
  148. output = sess.graph.get_tensor_by_name(signature_def[signature_key].outputs["outputs"].name)
  149. self.model_person = [[input0,input1],output]
  150. return self.model_person
  151. '''
  152. if self.model_person is None:
  153. self.model_person = models.load_model(self.model_person_file,custom_objects={'precision':precision,'recall':recall,'f1_score':f1_score})
  154. return self.model_person
  155. '''
  156. '''
  157. def load_weights(self):
  158. model = self.getModel()
  159. model.load_weights(self.model_person_file)
  160. '''
  161. def encode(self,tokens,begin_index,end_index,**kwargs):
  162. # return embedding(spanWindow(tokens=tokens,begin_index=begin_index,end_index=end_index,size=10),shape=(2,10,128))
  163. return embedding(spanWindow(tokens=tokens,begin_index=begin_index,end_index=end_index,size=35),shape=(2,35,128))
  164. def predict(self,x):
  165. x = np.transpose(np.array(x),(1,0,2,3))
  166. model_person = self.getModel()
  167. assert len(x)==len(model_person[0])
  168. feed_dict = {}
  169. for _x,_t in zip(x,model_person[0]):
  170. feed_dict[_t] = _x
  171. list_result = limitRun(self.sess_person,[model_person[1]],feed_dict)[0]
  172. return list_result
  173. #return self.sess_person.run(model_person[1],feed_dict=feed_dict)
  174. '''
  175. with self.graph.as_default():
  176. return self.getModel().predict([x[0],x[1]])
  177. '''
  178. class Model_form_line():
  179. def __init__(self,lazyLoad=getLazyLoad()):
  180. self.model_file = os.path.dirname(__file__)+"/../form/model/model_form.model - 副本.hdf5"
  181. self.model_form = None
  182. self.graph = tf.get_default_graph()
  183. if not lazyLoad:
  184. self.getModel()
  185. def getModel(self):
  186. if self.model_form is None:
  187. self.model_form = models.load_model(self.model_file,custom_objects={"precision":precision,"recall":recall,"f1_score":f1_score})
  188. return self.model_form
  189. def encode(self,data,shape=(100,60),expand=False,**kwargs):
  190. embedding = np.zeros(shape)
  191. word_model = getModel_word()
  192. for i in range(len(data)):
  193. if i>=shape[0]:
  194. break
  195. if data[i] in word_model.vocab:
  196. embedding[i] = word_model[data[i]]
  197. if expand:
  198. embedding = np.expand_dims(embedding,0)
  199. return embedding
  200. def predict(self,x):
  201. with self.graph.as_default():
  202. return self.getModel().predict(x)
  203. class Model_form_item():
  204. def __init__(self,lazyLoad=getLazyLoad()):
  205. self.model_file = os.path.dirname(__file__)+"/../form/log/ep039-loss0.038-val_loss0.064-f10.9783.h5"
  206. self.model_form = None
  207. self.sess_form = tf.Session(graph=tf.Graph())
  208. if not lazyLoad:
  209. self.getModel()
  210. def getModel(self):
  211. if self.model_form is None:
  212. with self.sess_form.as_default() as sess:
  213. with sess.graph.as_default():
  214. meta_graph_def = tf.saved_model.loader.load(sess,tags=["serve"],export_dir="%s/form_savedmodel"%(os.path.dirname(__file__)))
  215. signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
  216. signature_def = meta_graph_def.signature_def
  217. inputs = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["inputs"].name)
  218. output = sess.graph.get_tensor_by_name(signature_def[signature_key].outputs["outputs"].name)
  219. self.model_form = [[inputs],output]
  220. return self.model_form
  221. '''
  222. if self.model_form is None:
  223. with self.graph.as_defalt():
  224. self.model_form = models.load_model(self.model_file,custom_objects={"precision":precision,"recall":recall,"f1_score":f1_score})
  225. return self.model_form
  226. '''
  227. def encode(self,data,**kwargs):
  228. return encodeInput([data], word_len=50, word_flag=True,userFool=False)[0]
  229. return encodeInput_form(data)
  230. def predict(self,x):
  231. model_form = self.getModel()
  232. list_result = limitRun(self.sess_form,[model_form[1]],feed_dict={model_form[0][0]:x})[0]
  233. return list_result
  234. #return self.sess_form.run(model_form[1],feed_dict={model_form[0][0]:x})
  235. '''
  236. with self.graph.as_default():
  237. return self.getModel().predict(x)
  238. '''
  239. class Model_form_context():
  240. def __init__(self,lazyLoad=getLazyLoad()):
  241. self.model_form = None
  242. self.sess_form = tf.Session(graph=tf.Graph())
  243. if not lazyLoad:
  244. self.getModel()
  245. def getModel(self):
  246. if self.model_form is None:
  247. with self.sess_form.as_default() as sess:
  248. with sess.graph.as_default():
  249. meta_graph_def = tf.saved_model.loader.load(sess,tags=["serve"],export_dir="%s/form_context_savedmodel"%(os.path.dirname(__file__)))
  250. signature_key = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
  251. signature_def = meta_graph_def.signature_def
  252. inputs = sess.graph.get_tensor_by_name(signature_def[signature_key].inputs["inputs"].name)
  253. output = sess.graph.get_tensor_by_name(signature_def[signature_key].outputs["outputs"].name)
  254. self.model_form = [[inputs],output]
  255. return self.model_form
  256. '''
  257. if self.model_form is None:
  258. with self.graph.as_defalt():
  259. self.model_form = models.load_model(self.model_file,custom_objects={"precision":precision,"recall":recall,"f1_score":f1_score})
  260. return self.model_form
  261. '''
  262. def encode_table(self,inner_table,size=30):
  263. def encode_item(_table,i,j):
  264. _x = [_table[j-1][i-1],_table[j-1][i],_table[j-1][i+1],
  265. _table[j][i-1],_table[j][i],_table[j][i+1],
  266. _table[j+1][i-1],_table[j+1][i],_table[j+1][i+1]]
  267. e_x = [encodeInput_form(_temp[0],MAX_LEN=30) for _temp in _x]
  268. _label = _table[j][i][1]
  269. # print(_x)
  270. # print(_x[4],_label)
  271. return e_x,_label,_x
  272. def copytable(inner_table):
  273. table = []
  274. for line in inner_table:
  275. list_line = []
  276. for item in line:
  277. list_line.append([item[0][:size],item[1]])
  278. table.append(list_line)
  279. return table
  280. table = copytable(inner_table)
  281. padding = ["#"*30,0]
  282. width = len(table[0])
  283. height = len(table)
  284. table.insert(0,[padding for i in range(width)])
  285. table.append([padding for i in range(width)])
  286. for item in table:
  287. item.insert(0,padding.copy())
  288. item.append(padding.copy())
  289. data_x = []
  290. data_y = []
  291. data_text = []
  292. data_position = []
  293. for _i in range(1,width+1):
  294. for _j in range(1,height+1):
  295. _x,_y,_text = encode_item(table,_i,_j)
  296. data_x.append(_x)
  297. _label = [0,0]
  298. _label[_y] = 1
  299. data_y.append(_label)
  300. data_text.append(_text)
  301. data_position.append([_i-1,_j-1])
  302. # input = table[_j][_i][0]
  303. # item_y = [0,0]
  304. # item_y[table[_j][_i][1]] = 1
  305. # data_x.append(encodeInput([input], word_len=50, word_flag=True,userFool=False)[0])
  306. # data_y.append(item_y)
  307. return data_x,data_y,data_text,data_position
  308. def encode(self,inner_table,**kwargs):
  309. data_x,_,_,data_position = self.encode_table(inner_table)
  310. return data_x,data_position
  311. def predict(self,x):
  312. model_form = self.getModel()
  313. list_result = limitRun(self.sess_form,[model_form[1]],feed_dict={model_form[0][0]:x})[0]
  314. return list_result
  315. # class Model_form_item():
  316. # def __init__(self,lazyLoad=False):
  317. # self.model_file = os.path.dirname(__file__)+"/ep039-loss0.038-val_loss0.064-f10.9783.h5"
  318. # self.model_form = None
  319. #
  320. # if not lazyLoad:
  321. # self.getModel()
  322. # self.graph = tf.get_default_graph()
  323. #
  324. # def getModel(self):
  325. # if self.model_form is None:
  326. # self.model_form = models.load_model(self.model_file,custom_objects={"precision":precision,"recall":recall,"f1_score":f1_score})
  327. # return self.model_form
  328. #
  329. # def encode(self,data,**kwargs):
  330. #
  331. # return encodeInput_form(data)
  332. #
  333. # def predict(self,x):
  334. # with self.graph.as_default():
  335. # return self.getModel().predict(x)