网站首页 > java教程 正文
让 Java 和 Python 携手合作非常容易,这在开发原型时尤其有价值。
我们从一个实现 Snake 游戏逻辑的 Java 程序开始:场上总有一块食物。每当蛇到达食物时,它就会生长并出现新的食物。如果蛇咬自己或咬墙,游戏结束。
我们的目标是训练一个神经网络来控制蛇,让蛇在犯错和游戏结束之前吃掉尽可能多的食物。首先,我们需要一个代表游戏当前状态的张量。它充当我们神经网络的输入,以便网络可以使用它来预测下一步要采取的最佳步骤。为了让这个例子简单,我们的张量只是一个包含七个元素的向量,可以是 1 或 0:前四个表示食物是在蛇的右边、左边、前面还是后面,接下来的三个条目表示如果蛇头的左边、前面和右边的田地都被一堵墙或蛇的尾巴挡住了。
我们示例的完整源代码可在 GitHub 上找到。
使用 JPype 导入Java类即可:
<b>import</b> jpype
<b>import</b> jpype.<b>import</b>s
from jpype.types <b>import</b> *
# launch the JVM
jpype.startJVM(classpath=['../target/autosnake-1.0-SNAPSHOT.jar'])
# <b>import</b> the Java module
from me.schawe.autosnake <b>import</b> SnakeLogic
# construct an object of the `SnakeLogic` <b>class</b> ...
width, height = 10, 10
snake_logic = SnakeLogic(width, height)
# ... and call a method on it
print(snake_logic.trainingState())
JPype 在与 Python 解释器相同的进程中启动 JVM,并让它们使用 Java 本机接口 (JNI) 进行通信。
其他选项:
- Jython 直接在 JVM 中执行 Python 解释器,这样 Python 和 Java 就可以非常高效地使用相同的数据结构。但这对使用原生 Python 库有一些缺点——因为我们将使用numpy和tensorflow,这对我们来说不是一个选择。
- Py4J 处于频谱的另一侧。它在 Java 代码中启动一个套接字,它可以通过它与 Python 程序进行通信。优点是任意数量的 Python 进程可以连接到一个长时间运行的 Java 进程——或者相反,一个 Python 进程可以连接到多个 JVM,甚至通过网络。缺点是套接字通信的开销较大。
在 Java 中加载模型
使用deeplearning4j将训练好的模型加载到 Java 中……
<font><i>// https://deeplearning4j.konduit.ai/deeplearning4j/how-to-guides/keras-import</i></font><font>
<b>public</b> <b>class</b> Autopilot {
ComputationGraph model;
<b>public</b> Autopilot(String pathToModel) {
<b>try</b> {
model = KerasModelImport.importKerasModelAndWeights(pathToModel, false);
} <b>catch</b> (Exception e) {
e.printStackTrace();
}
}
</font><font><i>// infer the next move from the given state</i></font><font>
<b>public</b> <b>int</b> nextMove(<b>boolean</b>[] state) {
INDArray input = Nd4j.create(state).reshape(1, state.length);
INDArray output = model.output(input)[0];
<b>int</b> action = output.ravel().argMax().getInt(0);
<b>return</b> action;
}
}
调用:
<b>public</b> <b>class</b> SnakeLogic {
Autopilot autopilot = <b>new</b> Autopilot(</font><font>"path/to/model.h5"</font><font>);
<b>public</b> <b>void</b> update() {
<b>int</b> action = autopilot.nextMove(trainingState());
turnRelative(action);
</font><font><i>// rest of the update omitted</i></font><font>
}
</font><font><i>// further methods omitted</i></font><font>
}
</font>
猜你喜欢
- 2024-09-22 python实现WebService协议使用(pythonwebserver接口开发)
- 2024-09-22 玩转Termux:教你在手机上安装运行Python!
- 2024-09-22 Javaer自学python,吐槽难受的点(学了java再学python容易吗)
- 2024-09-22 实例编程:多语言语言调用Golang共享库
- 2024-09-22 Python 和 Java 基础对比 05 —— 程序的控制语句
- 2024-09-22 Python的模块导入和重载(python中模块导入的方法)
- 2024-09-22 python内置函数通过字符串的方式来执行函数代码块
- 2024-09-22 关于不同编程语言相互调用的思考(不同编程语言对接)
- 2024-09-22 Python 3.13 或将引入 JIT!(python引入包从哪里引入)
- 2024-09-22 如何使用 Python 实现网页自动化朗读?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)