之前参见了中国软件杯大赛,在大赛中用到了深度学习的相关算法,也训练了一些简单的模型。项目线上平台是用java编写的web应用程序,而深度学习使用的是python语言,这就涉及到了在java代码中调用python语言的方法。

  为了能在java应用中使用python语言训练的算法模型,我在网上找了很久。我大概找到了三种方法

  1. java代码可以直接调用python代码,只需要下载相应的jar包就行。这种方式我没有尝试,只是觉得这样做使得java应用太过于依赖python的环境了。还有网上也有将python代码打包成jar的方法,然后可以让java代码调用,但是很多第三方库不能打包成jar包。

  2. 将python训练的模型参数保存到文本中,用java代码重现模型的预测算法。我之前就这样做过。这么做显然工作量太大,而且出现的bug几率大大增加。最重要的是很多深度学习的框架就没办法用了。

  3. 使用python进程运行深度学习中训练的模型,在java应用程序中调用python进程提供的服务。这种方法我认为是最好的。python语言写得程序毕竟还是在python环境中执行最有效率。而且python应用和java应用可以运行在不同的服务器上,通过进程的远程访问调用。

  以下是我实现java应用程序访问python进程的python代码部分。进程之间只能是通过socket进行通信。我本来想过用python编写一个web应用,对java提供HTTP服务,后来觉得这样还需要web服务器,对环境依赖太大,而且两个进程间的通信也很简单,所以干脆直接用socket进行调用得了

import socket
import sys
import threading
import json
import numpy as np
from tag import train2
# nn=network.getNetWork()
# cnn = conv.main(False)
# 深度学习训练的神经网络,使用TensorFlow训练的神经网络模型,保存在文件中
nnservice = train2.NNService(model='model/20180731.ckpt-1000')
def main():
# 创建服务器套接字
serversocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 获取本地主机名称
host = socket.gethostname()
# 设置一个端口
port = 12345
# 将套接字与本地主机和端口绑定
serversocket.bind((host,port))
# 设置监听最大连接数
serversocket.listen(5)
# 获取本地服务器的连接信息
myaddr = serversocket.getsockname()
print("服务器地址:%s"%str(myaddr))
# 循环等待接受客户端信息
while True:
# 获取一个客户端连接
clientsocket,addr = serversocket.accept()
print("连接地址:%s" % str(addr))
try:
t = ServerThreading(clientsocket)#为每一个请求开启一个处理线程
t.start()
pass
except Exception as identifier:
print(identifier)
pass
pass
serversocket.close()
pass class ServerThreading(threading.Thread):
# words = text2vec.load_lexicon()
def __init__(self,clientsocket,recvsize=1024*1024,encoding="utf-8"):
threading.Thread.__init__(self)
self._socket = clientsocket
self._recvsize = recvsize
self._encoding = encoding
pass def run(self):
print("开启线程.....")
try:
#接受数据
msg = ''
while True:
# 读取recvsize个字节
rec = self._socket.recv(self._recvsize)
# 解码
msg += rec.decode(self._encoding)
# 文本接受是否完毕,因为python socket不能自己判断接收数据是否完毕,
# 所以需要自定义协议标志数据接受完毕
if msg.strip().endswith('over'):
msg=msg[:-4]
break
# 解析json格式的数据
re = json.loads(msg)
# 调用神经网络模型处理请求
res = nnservice.hand(re['content'])
sendmsg = json.dumps(res)
# 发送数据
self._socket.send(("%s"%sendmsg).encode(self._encoding))
pass
except Exception as identifier:
self._socket.send("".encode(self._encoding))
print(identifier)
pass
finally:
self._socket.close()
print("任务结束.....") pass def __del__(self): pass
if __name__ == "__main__":
main()

在java代码中访问python进程的代码:

    private Object remoteCall(String content){
JSONObject jsonObject = new JSONObject();
jsonObject.put("content", content);
String str = jsonObject.toJSONString();
// 访问服务进程的套接字
Socket socket = null;
List<Question> questions = new ArrayList<>();
log.info("调用远程接口:host=>"+HOST+",port=>"+PORT);
try {
// 初始化套接字,设置访问服务的主机和进程端口号,HOST是访问python进程的主机名称,可以是IP地址或者域名,PORT是python进程绑定的端口号
socket = new Socket(HOST,PORT);
// 获取输出流对象
OutputStream os = socket.getOutputStream();
PrintStream out = new PrintStream(os);
// 发送内容
out.print(str);
// 告诉服务进程,内容发送完毕,可以开始处理
out.print("over");
// 获取服务进程的输入流
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
String tmp = null;
StringBuilder sb = new StringBuilder();
// 读取内容
while((tmp=br.readLine())!=null)
sb.append(tmp).append('\n');
// 解析结果
JSONArray res = JSON.parseArray(sb.toString()); return res;
} catch (IOException e) {
e.printStackTrace();
} finally {
try {if(socket!=null) socket.close();} catch (IOException e) {}
log.info("远程接口调用结束.");
}
return null;
}

java web应用调用python深度学习训练的模型的更多相关文章

  1. 中文译文:Minerva-一种可扩展的高效的深度学习训练平台(Minerva - A Scalable and Highly Efficient Training Platform for Deep Learning)

    Minerva:一个可扩展的高效的深度学习训练平台 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2015-12-1 声明 ...

  2. 7大python 深度学习框架的描述及优缺点绍

    Theano https://github.com/Theano/Theano 描述: Theano 是一个python库, 允许你定义, 优化并且有效地评估涉及到多维数组的数学表达式. 它与GPUs ...

  3. 利用python深度学习算法来绘图

    可以画画啊!可以画画啊!可以画画啊! 对,有趣的事情需要讲三遍. 事情是这样的,通过python的深度学习算法包去训练计算机模仿世界名画的风格,然后应用到另一幅画中,不多说直接上图! 这个是世界名画& ...

  4. Java Web开发和Python Web开发之间的区别

    今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...

  5. 基于NVIDIA GPUs的深度学习训练新优化

    基于NVIDIA GPUs的深度学习训练新优化 New Optimizations To Accelerate Deep Learning Training on NVIDIA GPUs 不同行业采用 ...

  6. 基于python深度学习的apk风险预测脚本

    基于python深度学习的apk风险预测脚本 为了有效判断安卓apk有无恶意操作,利用python脚本,通过解包apk文件,对其中xml文件进行特征提取,通过机器学习构建模型,预测位置的apk包是否有 ...

  7. 深度学习训练过程中的学习率衰减策略及pytorch实现

    学习率是深度学习中的一个重要超参数,选择合适的学习率能够帮助模型更好地收敛. 本文主要介绍深度学习训练过程中的6种学习率衰减策略以及相应的Pytorch实现. 1. StepLR 按固定的训练epoc ...

  8. 好书推荐计划:Keras之父作品《Python 深度学习》

    大家好,我禅师的助理兼人工智能排版住手助手条子.可能非常多人都不知道我.由于我真的难得露面一次,天天给禅师做底层工作. wx_fmt=jpeg" alt="640? wx_fmt= ...

  9. 深度学习的seq2seq模型——本质是LSTM,训练过程是使得所有样本的p(y1,...,yT‘|x1,...,xT)概率之和最大

    from:https://baijiahao.baidu.com/s?id=1584177164196579663&wfr=spider&for=pc seq2seq模型是以编码(En ...

随机推荐

  1. 浅析为什么 char 类型的范围是 : -128~+127

    在 C 语言中. signed char 类型的范围为 -128~127,每本教科书上也这么写.可是没有哪一本书上(包含老师)也不会给你为什么是 -128~127,这个问题貌似看起来也非常easyea ...

  2. QtWebkit里RenderLayer树的绘制具体流程分析

           更新:RenderLayer树的绘制对RenderObject的绘制.同一时候补足绘制阶段的描写叙述.        QtWebkit里,QWebView,QWebPage和QWebFr ...

  3. 使用OpenCV把二进制mnist数据集转换为图片

    mnist数据集是以二进制形式保存的,这里借助OpenCV把mnist数据集转换成图片格式.转换程序如下: #include <iostream> #include <fstream ...

  4. 43.$http

    转自:https://www.cnblogs.com/best/tag/Angular/ $http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据. 使用格式: // 简单的 G ...

  5. 索引-mysql索引创建、查看、删除及使用示例

    mysql索引创建.查看.删除及使用示例 1.创建索引: ALTER TABLE用来创建普通索引.UNIQUE索引或PRIMARY KEY索引. ALTER TABLE table_name ADD ...

  6. 存储过程的调用和Parameters数组的调用

    记录一些杂记吧 declare @d datetime set @d=GETDATE() select * from [ACC_B2B].[dbo].ORDER_Head --where 1=1 se ...

  7. Spring SpEL in JSP and Assign SpEL value to Java variable in JSP

    Spring SpEL in JSP and Assign SpEL value to Java variable in JSP method 1 use----ServletContextAttri ...

  8. <Sicily>Rails

    一.题目描述 There is a famous railway station in PopPush City. Country there is incredibly hilly. The sta ...

  9. 976 B. Lara Croft and the New Game

    You might have heard about the next game in Lara Croft series coming out this year. You also might h ...

  10. javascript上下文this

    js的四种调用方式: 一 作为函数的调用: 在严格模式下this,undefined,在非严格模式下指向全局window对象. 二 作为方法调用: this通常指向调用的对象 三 作为构造函数的调用: ...