package org.algorithm.test;

//Invoke in Java

import org.tensorflow.SavedModelBundle;
import org.tensorflow.Session;
import org.tensorflow.Tensor;
import org.tensorflow.TensorFlow;

import java.nio.FloatBuffer;

/**
 * java 调用Python训练的模型
 * @Author: bijl
 * @Date: 2018年7月18日-下午1:34:45
 * @Description:
 */
public class HelloTF {

    public static void main(String[] args) {
        // good idea to print the version number, 1.2.0 as of this writing
        System.out.println(TensorFlow.version());
        final int NUM_PREDICTIONS = 1;
        long[] xShape = {2, 4};
        
        // 所有输入值会以缓冲的方式放到一个列表中，Tensor对象在根据shape切开。
        float[] xValue = {4.5f,2.3f,1.3f,0.3f,6.6f,2.9f,4.6f,1.3f};

        /* load the model Bundle */
        SavedModelBundle b = SavedModelBundle.load("/tmp/model", "serve");

        // create the session from the Bundle
        Session sess = b.session();
        
        // create an input Tensor, value = 2.0f
        Tensor x = Tensor.create(
                xShape ,  // shape
                FloatBuffer.wrap(xValue)  // value
        );

        // run the model and get the result, 4.0f.
        float[][] y = sess.runner()  // 获取一个runner对象 
                .feed("x", x)   // feed,'X':x, 等同于python中的feed流
                .fetch("softmax")     //  要获取的tensor，通过名字识别，可以添加多个
                .run()          //  运行，会返回一个list of tensor
                .get(0)         // list 的方法
                .copyTo(new float[2][3]);  // tensor的方法：类型转换

        // print out the result.
        for (int i = 0; i<y.length;i++)
            for (int j=0;j<y[i].length;j++)
                System.out.println(y[i][j]);
    }
}