django调用java_07.手把手教将深度学习利用Django将模型发布成服务供java调用
標題
問題
一.python發(fā)布成服務(wù)
1.先建立一個深度學(xué)習(xí)模型并訓(xùn)練好
2.建立一個預(yù)測方法去調(diào)用訓(xùn)練好的模型
3.建立一個Django工程
4.將python利用模型預(yù)測的代碼放入Django項目中
5.get請求加上參數(shù)
6.github
二.JAVA請求url,返回json數(shù)據(jù)
問題
python作為一個含科學(xué)計算與深度學(xué)習(xí)以及機器學(xué)習(xí)包豐富的語言,自然收到從事算法工作的大佬的青睞,java往往在這一塊欠缺,可以利用java做深度學(xué)習(xí),但是特別麻煩,現(xiàn)在學(xué)習(xí)深度學(xué)習(xí)的基本人人都會點python,但是往往在實際項目中由于各種原因,java依舊是web開發(fā)的主力,網(wǎng)上一些做法就是直接將java在程序里面調(diào)用python程序,但是這樣的話會出各種不兼容和版本的問題,我覺得最好是將深度學(xué)習(xí)模型預(yù)測這塊的代碼用Django發(fā)布成一個服務(wù)然后供java這邊通過url調(diào)用。
一.python發(fā)布成服務(wù)
1.先建立一個深度學(xué)習(xí)模型并訓(xùn)練好
BiLSTM+CRF模型構(gòu)建
inputs = Input(shape=(MAX_LEN,), dtype='int32')
x = Masking(mask_value=0)(inputs)
x = Embedding(VOCAB_SIZE, EMBED_DIM, mask_zero=True)(x)
x = Bidirectional(LSTM(HIDDEN_SIZE, return_sequences=True))(x)
x = TimeDistributed(Dense(CLASS_NUMS))(x)
outputs = CRF(CLASS_NUMS)(x)
model = Model(inputs=inputs, outputs=outputs)
model.summary()
比如我這是先建立了一個命名實體識別的深度學(xué)習(xí)模型,用keras建立的,并訓(xùn)練生成模型ch_ner_model4.h5,模型建立如上所示,具體代碼請移步github,后面會貼出。
2.建立一個預(yù)測方法去調(diào)用訓(xùn)練好的模型
加載模型,具體代碼請移步github,后面會貼出。
'''用來預(yù)測'''
from keras.models import load_model
import numpy as np
custom_ob = {'CRF': CRF,"crf_loss":crf_loss,"crf_viterbi_accuracy":crf_viterbi_accuracy,"f1":f1}
model = load_model('model/ch_ner_model3.h5', custom_objects=custom_ob)
maxlen = 500
3.建立一個Django工程
很簡單,pip install Django即可,不過注意版本號,我這用的是3.0以上的。我這采用Anaconda建立的虛擬環(huán)境。
用命令django-admin startproject ner_web_v1建立這個工程,然后cd進去,輸入命令
python3 manage.py runserver 127.0.0.1:8000/??吹较旅孢@個即啟動Django成功.
4.將python利用模型預(yù)測的代碼放入Django項目中
就是圖1中第三個箭頭的指向建立一個這樣的預(yù)測代碼,注意文件夾以及文件的位置。可以把所有的模型預(yù)測代碼都封裝在一個方法里面,然后最終返回的話如果返回json數(shù)據(jù)的話,利用下面的代碼返回json數(shù)據(jù),這樣不僅能返回json數(shù)據(jù)而且中文和字符不會報錯,解決了Django返回json的中文字符亂碼問題。
return HttpResponse(json.dumps(TextLine,ensure_ascii=False), content_type="application/json,charset=utf-8")
在url這里面還要配上路徑,我這隨便配置了hello,右邊的ner.hello就是之前封裝代碼的方法,需要import引入。
5.get請求加上參數(shù)
我這的請求主要需要加上數(shù)據(jù)庫中的id作為請求值。
所以在ner_web_v1加上獲取請求的參數(shù),id = request.GET.get(‘id’, ‘0’)。
請求時候加上id參數(shù)即可。
6.github
https://github.com/zbelieve/ner
代碼中的數(shù)據(jù)庫表特別簡單可以自己建立一個,TX_TEXT是一些純文本文章。傳的id就是TM_ID。
里面的路徑比如字典和模型路徑,改成自己本機的絕對路徑即可。有用的話,麻煩賞個星。我也是邊學(xué)邊做,講的不對的勿噴。
二.JAVA請求url,返回json數(shù)據(jù)
java這塊在測試包中利用restTemplate發(fā)送請求,即可獲取之前python發(fā)布服務(wù)后傳的json數(shù)據(jù)
@SpringBootTest
@RunWith(SpringRunner.class)
public class testRestTemplate {
@Autowired
RestTemplate restTemplate;
@Test
//測試遠程連接獲取模型數(shù)據(jù),這個就是模型+數(shù)據(jù)中的數(shù)據(jù)
public void testRestTemplate(){
// 封裝參數(shù),這里是HashMap
Map paramMap = new HashMap();
paramMap.put("id", "11111111");
//測試這個的時候要把服務(wù)器開了
//url請求返回的是json數(shù)據(jù),之后在這兒轉(zhuǎn)換map,就是鍵值對類型的,這兒獲取的遠程訪問的數(shù)據(jù)是cmsconfig的數(shù)據(jù),主要想獲取他的圖片數(shù)據(jù)在服務(wù)器的url,靜態(tài)化分為模板和數(shù)據(jù),這兒就是獲得動態(tài)的數(shù)據(jù)
//ResponseEntityforEntity = restTemplate.getForEntity("http://localhost:31001/cms/config/getmodel/5a791725dd573c3574ee333f", Map.class);
ResponseEntity forEntity2 = restTemplate.getForEntity("http://127.0.0.1:8000/hello?id={id}", Map.class,paramMap);
System.out.println(forEntity2);
System.out.println("x");
}
}
java這塊調(diào)用我直接在測試包中寫的,可以在下面找到源碼,里面相關(guān)的pom文件就引入就行了。
https://github.com/zbelieve/MicroservicesWeb/tree/master/xc-service-manage-cms/src/test/java/com/xuecheng/manage_cms/dao
總結(jié)
以上是生活随笔為你收集整理的django调用java_07.手把手教将深度学习利用Django将模型发布成服务供java调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python类实例化_python基础8
- 下一篇: pytorch 矩阵相乘_深度学习 —