Problema ao carregar / servir modelo de tensorflow em java usando estimadores

Utilizei os dados do censo e criei um modelo amplo e profundo usando os estimadores api em tensorflow. Ao carregar o modelo em Java, parece haver um erro que não permite que o modelo seja carregado. Exceção parece

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) 

Por favor, encontrar o código python abaixo usado para salvar o modelo: https://gist.github.com/gaganmalhotra/cd6a5898b9caf9005a05c8831a9b9153

O código Java usado é o seguinte:

  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: Versão Tensorflow usada: 1.3

Quando você usa operações no módulo tf.contrib , elas não são consideradas experimentais, portanto, não fazem parte da API estável do TensorFlow e não são incluídas em outras distribuições de linguagem.

No entanto, no TensorFlow 1.4 e superior, você pode carregar explicitamente a biblioteca compartilhada em Java usando o TensorFlow.loadLibrary() .

Para fazer isso, primeiro você precisa encontrar o local da biblioteca compartilhada que contém a implementação da operação tf.contrib em que você está interessado. Neste caso, parece que é tf.contrib.layers , então você faria algo como isso:

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

Qual imprimiria algo como:

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

Então você encontraria todas as bibliotecas compartilhadas nesse caminho usando algo como:

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

Qual seria algo como:

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

Tudo bem, agora você tem essa biblioteca, você pode carregá-la em Java usando:

 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. } 

Ressalvas:

  • Se você deseja rodar em uma máquina diferente, você deve empacotar o arquivo .so acima com seu programa e ajustar a chamada para TensorFlow.loadLibrary() apropriadamente.

  • Certifique-se de usar a mesma versão do TensorFlow para Python e Java (1.4)

Espero que ajude.