C贸mo usar TensorFlow con Java

    Introducci贸n

    El Machine Learning est谩 ganando popularidad y uso en todo el mundo. Ya ha cambiado dr谩sticamente la forma en que se crean ciertas aplicaciones y es probable que contin煤e siendo una parte enorme (y en aumento) de nuestra vida diaria.

    No hay forma de endulzarlo, el Machine Learning no es simple. Es bastante abrumador y puede parecer muy complejo para muchos.

    Empresas como Google se encargaron de acercar los conceptos de Machine Learning a los desarrolladores y permitirles dar sus primeros pasos gradualmente, con una gran ayuda.

    Por tanto, marcos como TensorFlow naci贸.

    驴Qu茅 es TensorFlow?

    TensorFlow es un marco de Machine Learning de c贸digo abierto desarrollado por Google en Python y C ++.

    Ayuda a los desarrolladores a adquirir datos, preparar y entrenar modelos, predecir estados futuros y realizar Machine Learning a gran escala.

    Con 茅l, podemos entrenar y ejecutar redes neuronales profundas que se utilizan con mayor frecuencia para el reconocimiento 贸ptico de caracteres, el reconocimiento / clasificaci贸n de im谩genes, el procesamiento del lenguaje natural, etc.

    Tensores y operaciones

    TensorFlow se basa en gr谩ficos computacionales, que puedes imaginar como un gr谩fico cl谩sico con nodes y bordes.

    Cada node se conoce como una operaci贸n, y toman cero o m谩s tensores y producen cero o m谩s tensores. Una operaci贸n puede ser muy simple, como una suma b谩sica, pero tambi茅n pueden ser muy complejas.

    Los tensores se representan como bordes del gr谩fico y son la unidad de datos central. Realizamos diferentes funciones en estos tensores a medida que los alimentamos a las operaciones. Pueden tener una o varias dimensiones, que a veces se denominan sus rangos – (Escalar: rango 0, Vector: rango 1, Matriz: rango 2)

    Estos datos fluyen a trav茅s del gr谩fico computacional a trav茅s de tensores, afectados por las operaciones, de ah铆 el nombre TensorFlow.

    Los tensores pueden almacenar datos en cualquier n煤mero de dimensiones y hay tres tipos principales de tensores: marcadores de posici贸n, variables y constantes.

    Instalaci贸n de TensorFlow

    Con Maven, instalar TensorFlow es tan f谩cil como incluir la dependencia:

    <dependency>
      <groupId>org.tensorflow</groupId>
      <artifactId>tensorflow</artifactId>
      <version>1.13.1</version>
    </dependency>
    

    Si su dispositivo admite Soporte de GPU, luego use estas dependencias:

    <dependency>
      <groupId>org.tensorflow</groupId>
      <artifactId>libtensorflow</artifactId>
      <version>1.13.1</version>
    </dependency>
    
    <dependency>
      <groupId>org.tensorflow</groupId>
      <artifactId>libtensorflow_jni_gpu</artifactId>
      <version>1.13.1</version>
    </dependency>
    

    Puede verificar la versi贸n de TensorFlow instalada actualmente usando el TensorFlow objeto:

    System.out.println(TensorFlow.version());
    

    API de TensorFlow Java

    Las ofertas de TensorFlow de la API de Java est谩n incluidas en org.tensorflow paquete. Actualmente es experimental, por lo que no se garantiza que sea estable.

    Tenga en cuenta que el 煤nico lenguaje totalmente compatible con TensorFlow es Python y que la API de Java no es tan funcional.

    Nos presenta nuevas clases, una interfaz, una enumeraci贸n y una excepci贸n.

    Clases

    Las nuevas clases introducidas a trav茅s de la API son:

    • Graph: Un gr谩fico de flujo de datos que representa un c谩lculo de TensorFlow
    • Operation: Un node Graph que realiza c谩lculos en tensores
    • OperationBuilder: Una clase de constructor para operaciones
    • Output<T>: Un identificador simb贸lico de un tensor producido por una Operaci贸n
    • SavedModelBundle: Representa un modelo cargado desde el almacenamiento.
    • SavedModelBundle.Loader: Proporciona opciones para cargar un modelo guardado
    • Server: Un servidor TensorFlow en proceso, para usar en entrenamiento distribuido
    • Session: Controlador para la ejecuci贸n de gr谩ficos
    • Session.Run: Tensores de salida y metadatos obtenidos al ejecutar una sesi贸n
    • Session.Runner: Ejecutar operaciones y evaluar tensores
    • Shape: La forma posiblemente parcialmente conocida de un tensor producido por una operaci贸n
    • Tensor<T>: Una matriz multidimensional de tipo est谩tico cuyos elementos son de un tipo descrito por T
    • TensorFlow: M茅todos de utilidad est谩ticos que describen el tiempo de ejecuci贸n de TensorFlow
    • Tensors: M茅todos de f谩brica con seguridad de tipos para crear objetos Tensor
    Enum
    • DataType: Representa el tipo de elementos en un tensor como una enumeraci贸n
    Interfaz
    • Operand<T>: Interfaz implementada por operandos de una operaci贸n de TensorFlow
    Excepci贸n
    • TensorFlowException: Se lanza una excepci贸n sin marcar al ejecutar TensorFlow Graphs

    Si comparamos todo esto con el m贸dulo tf en Python, hay una diferencia obvia. La API de Java no tiene casi la misma cantidad de funcionalidad, al menos por ahora.

    Gr谩ficos

    Como se mencion贸 anteriormente, TensorFlow se basa en gr谩ficos computacionales, donde org.tensorflow.Graph es la implementaci贸n de Java.

    Nota: Sus instancias son seguras para subprocesos, aunque necesitamos liberar expl铆citamente los recursos utilizados por Graph una vez que hayamos terminado con 茅l.

    Comencemos con un gr谩fico vac铆o:

    Graph graph = new Graph();
    

    Este gr谩fico no significa mucho, est谩 vac铆o. Para hacer algo con 茅l, primero debemos cargarlo con Operations.

    Para cargarlo con operaciones, usamos el opBuilder() m茅todo, que devuelve un OperationBuilder objeto que agregar谩 las operaciones a nuestro gr谩fico una vez que llamemos al .build() m茅todo.

    Constantes

    Agreguemos una constante a nuestro gr谩fico:

    Operation x = graph.opBuilder("Const", "x")
                   .setAttr("dtype", DataType.FLOAT)
                   .setAttr("value", Tensor.create(3.0f))
                   .build(); 
    

    Marcadores de posici贸n

    Los marcadores de posici贸n son un “tipo” de variable que no tiene un valor en la declaraci贸n. Sus valores se asignar谩n en una fecha posterior. Esto nos permite construir gr谩ficos con operaciones sin ning煤n dato real:

    Operation y = graph.opBuilder("Placeholder", "y")
            .setAttr("dtype", DataType.FLOAT)
            .build();
    

    Funciones

    Y ahora, finalmente, para redondear esto, necesitamos agregar ciertas funciones. Estos pueden ser tan simples como multiplicar, dividir o sumar, o tan complejos como multiplicaciones de matrices. Al igual que antes, definimos funciones usando el .opBuilder() m茅todo:

    Operation xy = graph.opBuilder("Mul", "xy")
      .addInput(x.output(0))
      .addInput(y.output(0))
      .build();         
    

    Nota: Estamos usando output(0) como tensor puede tener m谩s de una salida.

    Visualizaci贸n de gr谩ficos

    Lamentablemente, la API de Java a煤n no incluye ninguna herramienta que le permita visualizar gr谩ficos como lo har铆a en Python. Cuando la API de Java se actualice, tambi茅n lo har谩 este art铆culo.

    Sesiones

    Como se mencion贸 antes, un Session es el conductor de un GraphEjecuci贸n. Encapsula el entorno en el que Operationsy Graphs se ejecutan para calcular Tensors.

    Lo que esto significa es que los tensores en nuestro gr谩fico que construimos en realidad no tienen ning煤n valor, ya que no ejecutamos el gr谩fico dentro de una sesi贸n.

    Primero agreguemos el gr谩fico a una sesi贸n:

    Session session = new Session(graph);
    

    Nuestro c谩lculo simplemente multiplica el x y y valor. Para ejecutar nuestro gr谩fico y calcularlo, fetch() la xy operaci贸n y alimentarlo x y y valores:

    Tensor tensor = session.runner().fetch("xy").feed("x", Tensor.create(5.0f)).feed("y", Tensor.create(2.0f)).run().get(0);
    System.out.println(tensor.floatValue());
    

    Ejecutar este fragmento de c贸digo producir谩:

    10.0f
    

    Guardar modelos en Python y cargar en Java

    Esto puede sonar un poco extra帽o, pero dado que Python es el 煤nico lenguaje bien soportado, la API de Java todav铆a no tiene la funcionalidad para guardar modelos.

    Esto significa que la API de Java est谩 dise帽ada solo para el caso de uso de servicio, al menos hasta que sea totalmente compatible con TensorFlow. Al menos, podemos entrenar y guardar modelos en Python y luego cargarlos en Java para servirlos, usando el SavedModelBundle clase:

    SavedModelBundle model = SavedModelBundle.load("./model", "serve"); 
    Tensor tensor = model.session().runner().fetch("xy").feed("x", Tensor.create(5.0f)).feed("y", Tensor.create(2.0f)).run().get(0);  
    
    System.out.println(tensor.floatValue());
    

    Conclusi贸n

    TensorFlow es un marco potente, robusto y ampliamente utilizado. Se est谩 mejorando constantemente y 煤ltimamente se ha introducido en nuevos lenguajes, incluidos Java y JavaScript.

    Aunque la API de Java a煤n no tiene tanta funcionalidad como TensorFlow para Python, a煤n puede servir como una buena introducci贸n a TensorFlow para desarrolladores de Java.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *