【问题标题】:Issue while loading/serving tensorflow model in java using estimators使用估计器在 java 中加载/服务 tensorflow 模型时出现问题
【发布时间】:2018-04-26 20:39:50
【问题描述】:

我使用人口普查数据并使用 tensorflow 中的估算器 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)

请在下面找到用于保存模型的 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]);
}

PS:使用的 Tensorflow 版本:1.3

【问题讨论】:

    标签: java tensorflow tensorflow-serving


    【解决方案1】:

    当您在 tf.contrib 模块中使用操作时,它们不被认为是实验性的,因此不属于 stable TensorFlow API 并且不包含在其他语言发行版中。

    但是,在 TensorFlow 1.4 及更高版本中,您可以使用 TensorFlow.loadLibrary() 在 Java 中显式加载共享库。

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

    python -c "import tensorflow; print(tensorflow.contrib.layers.__path__)"
    

    这会打印出类似的东西:

    ['/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers']
    

    然后你会使用类似的方式找到该路径中的所有共享库:

    find /usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers -name "*.so"
    

    类似于:

    /usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers/python/ops/_sparse_feature_cross_op.so
    

    好的,现在你有了那个库,你可以使用 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.
    }
    

    注意事项:

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

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

    希望对您有所帮助。

    【讨论】:

    • 非常感谢@ash 提供的解决方法,我按照您提到的方式使用它并返回!
    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2021-08-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    相关资源
    最近更新 更多