我使用TensorFlow后端构建了 H2O深水模型(遵循Deep Water Booklet MNIST示例)。
(首先,我对H2O GBM模型做了同样的事情,以验证它在我的Java应用程序中没有深水依赖性的情况下工作。这很有效。)
我下载了Deep Water TensorFlow模型(我用Python构建):
modelfile = model.download_mojo(path="/h2o_testdata/generatedModels", get_genmodel_jar=True)
我认为这一步再次正常。现在,我想在我的Java应用程序中使用模型zip文件:
我在项目中添加了依赖项(h2o-genmodel.jar通过Maven和deepwater-all.jar通过复制和粘贴,因为我在Maven上找不到它)。 似乎我需要添加一些额外的依赖项或源代码来添加/应用TensorFlow'后端'(不知道'后端'在这里意味着什么,因为我只想在Java中进行推理,而不是模型训练)?< / strong>
我实例化模型:
EasyPredictModelWrapper model = new EasyPredictModelWrapper(MojoModel.load("src/main/resources/generatedModels/DeepWater_model_python_1503388273301_1.zip"));
以下是例外:
java.lang.UnsatisfiedLinkError: /private/var/folders/0s/0xdkb9n12yqdb3fs71926z3c0000gp/T/libtensorflow_jni.so147ba98b-e7e3-49bb-8d4e-e5a06efd7a66: dlopen(/private/var/folders/0s/0xdkb9n12yqdb3fs71926z3c0000gp/T/libtensorflow_jni.so147ba98b-e7e3-49bb-8d4e-e5a06efd7a66, 1): no suitable image found. Did find:
/private/var/folders/0s/0xdkb9n12yqdb3fs71926z3c0000gp/T/libtensorflow_jni.so147ba98b-e7e3-49bb-8d4e-e5a06efd7a66: unknown file type, first eight bytes: 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00
/private/var/folders/0s/0xdkb9n12yqdb3fs71926z3c0000gp/T/libtensorflow_jni.so147ba98b-e7e3-49bb-8d4e-e5a06efd7a66: unknown file type, first eight bytes: 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at deepwater.backends.tensorflow.LibraryLoader.loadNativeLib(LibraryLoader.java:87)
at deepwater.backends.tensorflow.TensorflowBackend.<clinit>(TensorflowBackend.java:30)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at hex.genmodel.algos.deepwater.DeepwaterMojoModel.createDeepWaterBackend(DeepwaterMojoModel.java:96)
at hex.genmodel.algos.deepwater.DeepwaterMojoReader.readModelData(DeepwaterMojoReader.java:31)
at hex.genmodel.ModelMojoReader.readAll(ModelMojoReader.java:143)
at hex.genmodel.ModelMojoReader.readFrom(ModelMojoReader.java:34)
at hex.genmodel.MojoModel.load(MojoModel.java:35)
at com.github.megachucky.kafka.streams.machinelearning.Kafka_Streams_Deep_Learning_H2O_MNIST.main(Kafka_Streams_Deep_Learning_H2O_MNIST.java:15)
Exception in thread "main" java.lang.UnsatisfiedLinkError: Cannot find TensorFlow native library for OS: darwin, architecture: x86_64. See https://github.com/tensorflow/tensorflow/tree/master/java/README.md for possible solutions (such as building the library from source).
at org.tensorflow.NativeLibrary.load(NativeLibrary.java:66)
at org.tensorflow.TensorFlow.init(TensorFlow.java:27)
at org.tensorflow.TensorFlow.<clinit>(TensorFlow.java:31)
at org.tensorflow.Graph.<clinit>(Graph.java:194)
at deepwater.backends.tensorflow.models.ModelFactory.readMetaGraph(ModelFactory.java:143)
at deepwater.backends.tensorflow.models.ModelFactory.LoadModelFromFile(ModelFactory.java:220)
at deepwater.backends.tensorflow.TensorflowBackend.buildNet(TensorflowBackend.java:74)
at hex.genmodel.algos.deepwater.DeepwaterMojoReader.readModelData(DeepwaterMojoReader.java:64)
at hex.genmodel.ModelMojoReader.readAll(ModelMojoReader.java:143)
at hex.genmodel.ModelMojoReader.readFrom(ModelMojoReader.java:34)
at hex.genmodel.MojoModel.load(MojoModel.java:35)
at com.github.megachucky.kafka.streams.machinelearning.Kafka_Streams_Deep_Learning_H2O_MNIST.main(Kafka_Streams_Deep_Learning_H2O_MNIST.java:15)
我找不到任何关于如何设置的文档,所以也许有人可以提供帮助? 或者我是否需要在笔记本电脑上安装TensorFlow,也可以在Java应用程序中显式使用?我认为H2O不需要它,因为它“只生成Java代码”,我可以在应用程序中使用它 - 类似于其他非DeepWater H2O模型?
顺便问一下:如何通过Maven依赖获得deepwater-all.jar?我找不到了。
答案 0 :(得分:0)
我只能回答你的第二个问题。你永远不应该将.jars复制到Maven项目中。您需要install them to you local repository并将依赖项添加到您的pom.xml。 (您可以选择您想要的工件和组。框架的供应商将是一个不错的选择)
答案 1 :(得分:0)
您无法使用Maven h2o-genmodel.jar。您必须使用来自您正在使用的H2O的h2o-genmodel.jar。深水-all.jar也是如此。它必须来自同一个H2O。 deepwater-all.jar包含您需要的所有代码,包括后端。
由于您使用了参数get_genmodel_jar = True,因此您在mojo的同时下载了该参数。这是你必须使用的。