使用估计器在 Java 中加载/提供 tensorflow 模型时出现问题

gag*_*tra 1 java tensorflow tensorflow-serving

我使用了人口普查数据并使用 tensorflow 中的 estimators api 创建了一个广泛而深入的模型。在 Java 中加载模型时,似乎存在一个错误,不允许加载模型。异常看起来像

Exception in thread "main" org.tensorflow.TensorFlowException: Op type not 
registered 'SparseFeatureCross' in binary running on gmalhotra-mba-2.local. 
Make sure the Op and Kernel are registered in the binary running in this 
process.
at org.tensorflow.SavedModelBundle.load(Native Method)
at org.tensorflow.SavedModelBundle.load(SavedModelBundle.java:39)
at deeplearning.DeepLearningTest.main(DeepLearningTest.java:32)
Run Code Online (Sandbox Code Playgroud)

请在下面找到用于保存模型的python代码:https : //gist.github.com/gaganmalhotra/cd6a5898b9caf9005a05c8831a9b9153

使用的Java代码如下:

    public static void main(String[] args) {
          try (SavedModelBundle b = SavedModelBundle.load("/Users/gagandeep.malhotra/Documents/SampleTF_projects/temporaryModel/1510624417/", "serve")) {


    Session sess = b.session();

                //Create the input sensor 
                  float[][] mat=new float[1][1];
                  mat[0]=new float[]{0.5f};

                // create tensors specific to inputs ....

                Tensor<?> x = (Tensor<?>) Tensor.create(mat);

                //run the model 
                float[][] y = sess.runner()
                        .feed("input", x)
                        .fetch("output")
                        .run()
                        .get(0)
                        .copyTo(new float[1][1]);               

               //print the result
                System.out.println(y[0][0]);
}
Run Code Online (Sandbox Code Playgroud)

PS:使用的 Tensorflow 版本:1.3

ash*_*ash 6

当您在tf.contrib模块中使用操作时,它们不被视为实验性的,因此不是稳定的 TensorFlow API 的一部分,也不包含在其他语言发行版中。

但是,在 TensorFlow 1.4 及更高版本中,您可以使用TensorFlow.loadLibrary().

为此,首先您需要找到包含tf.contrib您感兴趣的操作的实现的共享库的位置。在这种情况下,它似乎是tf.contrib.layers,因此您可以执行以下操作:

python -c "import tensorflow; print(tensorflow.contrib.layers.__path__)"
Run Code Online (Sandbox Code Playgroud)

这将打印如下内容:

['/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers']
Run Code Online (Sandbox Code Playgroud)

然后,您将使用以下内容找到该路径中的所有共享库:

find /usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers -name "*.so"
Run Code Online (Sandbox Code Playgroud)

这将是这样的:

/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers/python/ops/_sparse_feature_cross_op.so
Run Code Online (Sandbox Code Playgroud)

好的,现在你有了那个库,你可以用 Java 加载它:

public static void main(String[] args) {
    TensorFlow.loadLibrary("/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers/python/ops/_sparse_feature_cross_op.so");

    // And now load the model etc.
}
Run Code Online (Sandbox Code Playgroud)

注意事项:

  • 如果您想在不同的机器上运行,您需要将.so上面的文件与您的程序一起打包并TensorFlow.loadLibrary()适当地调整调用。

  • 确保您对 Python 和 Java (1.4) 使用相同的 TensorFlow 版本

希望有帮助。