Translate

2017年2月17日金曜日

TensorFlow for Java の README.md を翻訳してみて、邪推が外れたことを知る

 前々々日(2017/2/15)にGoogleがTensorFlow1.0をリリースしたと発表した。

Google、機械学習ライブラリ「TensorFlow 1.0」正式版を初リリース
http://cloud.watch.impress.co.jp/docs/news/1044644.html


でも先週末ころに TensorFlow の Java リンクがGitHubに変わっていたので
なんとなく
そろそろ1.0くるな
でJava実装もお披露目かな、と
わかってはいたのだけど..

ということで、

[GitHub] TensorFlow for Java
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/java/README.md

を翻訳してみた。

参照する場合は at your own risk でお願いします。


----------

TensorFlow for Java


TensorFlowライブラリのJavaバインディングです。


注意: TensorFlow Java APIは不完全で実験的なものであり、予告なく変更することがあります。 Issue #5 で進展を確認することができます。それまでは、TensorFlowをAndroidで使用するには、 contrib/ android 、 makefile または/もしくはAndroidのカメラデモを参照してください。

前提条件

  • bazel
  • TensorFlowをソースコードから構築するための環境(LinuxまたはMac OS X)。これらの詳細を読み飛ばしてGPUサポートを気にしない場合は、次のようにしてください:
# On Linux
sudo apt-get install python swig python-numpy

# On Mac OS X with homebrew
brew install swig

インストール


Javaアーカイブ(JAR)とネイティブライブラリを設定してビルドする:
# ビルドを設定します(e.g. GPUサポートなど)
# https://www.tensorflow.org/get_started/os_setup#configure_the_installation
./configure

# JARおよびネイティブライブラリをビルドします
bazel build --config opt \
  //tensorflow/java:tensorflow \
  //tensorflow/java:libtensorflow_jni

Maven


外部Javaプロジェクトでライブラリを使うためには、Mavenリポジトリに公開します。たとえば、 mvm ツール(別途インストール)を使用してライブラリをローカルの Maven リポジトリへ公開します:
bazel build -c opt //tensorflow/java:pom
mvn install:install-file \
  -Dfile=../../bazel-bin/tensorflow/java/libtensorflow.jar \
  -DpomFile=../../bazel-bin/tensorflow/java/pom.xml

Maven座標を使用してライブラリを参照してください。 たとえば、Mavenを使用している場合は、この依存関係を pom.xml ファイルに置きます(使用する TensorFlow ランタイムのバージョンで文字列 0.12.head を置き換えます)。
<dependency>
  <groupId>org.tensorflow</groupId>
  <artifactId>libtensorflow</artifactId>
  <version>0.12.head</version>
</dependency>

サンプル

bazel 使用

//tensorflow/java:tensorflow への依存関係を java_binary または java_library ルールに追加します。例えば:
bazel run -c opt //tensorflow/java/src/main/java/org/tensorflow/examples:label_image

javac 使用


コンパイルのためにクラスパスに libtensorflow.jar を追加してください。たとえば:
javac \
      -cp ../../bazel-bin/tensorflow/java/libtensorflow.jar \
      ./src/main/java/org/tensorflow/examples/LabelImage.java

実行中 libtensorflow.jar および libtensorflow_jni.so(OS Xの libtensorflow_jni.dylib )を使用可能にします。 例えば:
java \
      -Djava.library.path=../../bazel-bin/tensorflow/java \
      -cp ../../bazel-bin/tensorflow/java/libtensorflow.jar:./src/main/java \
      org.tensorflow.examples.LabelImage

以上
---------


TensorFlowの本質はPythonではなくC++ライブラリの方なので、
Javaからは直接C++ライブラリをJNIで活用する仕組みになっている。

主要なクラスは、以下の通り。

Graph クラス: 
TensorFlow計算を表すデータフローグラフ。

Operation クラス:
Tensorsで計算を実行するグラフノード。

OperationBuilder クラス:
グラフ操作のためのビルダクラス。

Output クラス:
Operationクラスによって生成されたテンソルのシンボリックハンドル。

Session クラス:
Graph 実行のためのドライバ。

Session.Run クラス:
セッション実行の際に得られるテンソルとメタデータを内包。

Session.Runner クラス:
Operation を実行し、 Tensor を評価する。

Shape クラス;
操作によって生成されるテンソルの部分的に既知である型式。

Tensor クラス:
多次元配列の型。

TensorFlow クラス:
TensorFlow実行状態を記述する静的ユーティリティメソッド。

あと、列挙型と例外クラスが1つづつ。

列挙型 DataType :
Tensorの要素タイプ。

例外クラス TensorFlowException :
TensorFlowグラフ実行中にスローされる、チェックされていない例外。



GitHubにサンプルコードが1つだけはいっていたので
のぞいてみると、
TensorFlow計算グラフをビルドするところは
GraphインスタンスをGraphBuilderクラスで定義するようで
ちょうどStringBuilderで文字列をがしがしつないでいくところと同じ感じで実装するようだ。
ただ、つくるのはGraphインスタンスではなく
Outputクラスというグラフの結果をもらう部分である。
注意するのはこのGraphBuilderクラスはTensorFlow側ライブラリのクラスではなく
このクラスのインナークラスになっていて中身はGraphインスタンスから
OperationBuilderインスタンスを取ってきてOperationつまりノードを定義していく。

..なんだかなあ..サンプルでそうしてるんなら、ライブラリ設計の時
もうちょっと頑張ってよ..

ならkerasのクラスをそのままJavaクラス化すればいいのに
それをしないのはKeras←→TensorFlowで書かれているPythonコードをJava化しないと
いけないからだろうなあ..


TensorFlow計算グラフ(Graphインスタンス)を実行するには、
Pythonと同じで、
Sessionインスタンスをnew して、Session.Runner インスタンスをもらい実行するのだけど
Pythonから予測するとその際にOperationインスタンスを指定するのだけど、
さきほどのOutputインスタンスからとってくるらしい。

このサンプルは学習済みInceptionモデルを復元して使っているようで
肝心のバッチを作って訓練する所がない..

TensorFlow for Java の設計は
 おそらくJavaを知っている人ではなく、
確実にTensorFlow/Pythonを知っているけどJavaはそれほど知らない人じゃないかな..

そうでないとこんなJDBCみたいなAPIつくらんでしょ..

Kerasのようなライブラリが
ぜったいJavaのAPIになるとおもっていたのだけど、
Oracleがハンドルし始めて黄昏を迎えているJava
コミュニティはもうとっくの昔に何処かへちっていってしまったのだろうか..

0 件のコメント:

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...