如何在Python中使用Java類? - codecentric
讓 Java 和 Python 攜手合作非常容易,這在開發原型時尤其有價值。
我們從一個實現 Snake 遊戲邏輯的 Java 程式開始:場上總有一塊食物。每當蛇到達食物時,它就會生長並出現新的食物。如果蛇咬自己或咬牆,遊戲結束。
我們的目標是訓練一個神經網路來控制蛇,讓蛇在犯錯和遊戲結束之前吃掉儘可能多的食物。首先,我們需要一個代表遊戲當前狀態的張量。它充當我們神經網路的輸入,以便網路可以使用它來預測下一步要採取的最佳步驟。為了讓這個例子簡單,我們的張量只是一個包含七個元素的向量,可以是 1 或 0:前四個表示食物是在蛇的右邊、左邊、前面還是後面,接下來的三個條目表示如果蛇頭的左邊、前面和右邊的田地都被一堵牆或蛇的尾巴擋住了。
我們示例的完整原始碼可在 GitHub 上找到。
使用JPype匯入Java類即可:
import jpype import jpype.imports from jpype.types import * # launch the JVM jpype.startJVM(classpath=['../target/autosnake-1.0-SNAPSHOT.jar']) # import the Java module from me.schawe.autosnake import SnakeLogic # construct an object of the `SnakeLogic` class ... 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 中……
// https://deeplearning4j.konduit.ai/deeplearning4j/how-to-guides/keras-import public class Autopilot { ComputationGraph model; public Autopilot(String pathToModel) { try { model = KerasModelImport.importKerasModelAndWeights(pathToModel, false); } catch (Exception e) { e.printStackTrace(); } } // infer the next move from the given state public int nextMove(boolean[] state) { INDArray input = Nd4j.create(state).reshape(1, state.length); INDArray output = model.output(input)[0]; int action = output.ravel().argMax().getInt(0); return action; } } 呼叫: public class SnakeLogic { Autopilot autopilot = new Autopilot("path/to/model.h5"); public void update() { int action = autopilot.nextMove(trainingState()); turnRelative(action); // rest of the update omitted } // further methods omitted } |
相關文章
- java中Scanner類使用Java
- Java中的Reference類使用Java
- 使用Axon重播投射事件 - codecentric AG Blog事件
- Python常見面試題011. 如何在Python中動態建立類?Python面試題
- 如何使用ParcelJS在Spring Boot應用程式中打包前端 - codecentric AG BlogJSSpring Boot前端
- Spring Boot 2.5.x能支援Java 17了 - codecentricSpring BootJava
- python中calss(類)的使用,類的教程,類中的函式怎麼呼叫。Python函式
- Python中類的建立和使用方法Python
- java中的抽象類abstract怎麼使用?Java抽象
- 如何在 Java 中使用 MQTTJavaMQQT
- 如何在Java中使用Deque? - Java67Java
- python類的使用Python
- python 類如何使用Python
- Java使用類-StringJava
- python中什麼時候使用自定義類Python
- Python中如何使用構造方法定義類Python構造方法
- Java中陣列及相關類的使用Java陣列
- 如何在Java中使用同步 -ManushaJava
- 關於如何在Python中使用靜態、類或抽象方法的權威指南Python抽象
- java中String類常用方法的使用與例項Java
- Java中的基本型別包裝類 Integer 類該怎麼使用?Java型別
- 如何在Java中做基準測試?JMH使用初體驗Java
- 如何在 Apache Flink 中使用 Python API?ApachePythonAPI
- 如何在Java中使用泛型 -ManushaJava泛型
- Angular2如何使用第三方類庫(如:jQuery)AngularjQuery
- python類中的方法Python
- python如何在cmd中升級pip?Python
- 如何在Linux 中安裝 Python 3.10LinuxPython
- Java列舉類在生產環境中的使用方式Java
- JAVA中object類中toString()方法JavaObject
- 如何在cmd下切換python版本使用Python
- Python基礎之:Python中的類Python
- java學習:Java中的其它類Java
- Java中,類與類,類中的程式碼執行順序Java
- 如何在python中讀取配置檔案Python
- 如何在Java中判斷是否為空Java
- 如何在 Java 中實現無向圖Java
- python3類中的Cat變數使用有限制嗎?Python變數