HelloTF em Clojure: usando a API Tensorflow Java

Tensorflow para Java é uma API ainda experimental, mas desenvolvida para usar TF no JVM, o que significa que podemos usá-lo Clojure, Yay!

Existem alguns light-wrappers para TF no Clojure para tornar a interoperabilidade mais idiomática, mas você pode hesitar em tentar trabalhar com duas camadas de indireção (especialmente porque a API Java não é totalmente estável). Esta é uma implementação sem wrapper do exemplo HelloTF localizado no site TensorFlow.

Instalando TensorFlow

Embora não tenhamos o Maven, o leiningen nos permite incluir o java jar imediatamente e você não deve se preocupar em realizar nenhuma etapa especial de instalação (apenas para CPU). Se você usar lein new app tf-demopara criar um aplicativo clojure básico, deverá apenas adicionar

[org.tensorflow/tensorflow "1.2.1"] ;; or whatever is latest version at the time of reading

para o seu project.clj

Implementando o exemplo HelloTF

(ns tf-demo.core
(:gen-class)
(:import (org.tensorflow Tensor
TensorFlow
Graph
Session)))

(defn -main
"Execute basic HelloTF Example"
[& args]
(try (let [graph (let [g (Graph.)
value (str "Hello from " (TensorFlow/version))
t
(Tensor/create (.getBytes value))]

(-> (.opBuilder g "Const" "MyConst")
(.setAttr "dtype" (.dataType t))
(.setAttr "value" t)
(.build))
g
)]
(try (let [output (-> (Session. graph)
(.runner)
(.fetch "MyConst")
(.run)
(.get 0))]
(println (String. (.bytesValue output) "UTF-8")))))))

Executando o código

lein run => “Olá de <número da versão>”