前々々日(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ライブラリのJavaバインディングです。
Javaアーカイブ(JAR)とネイティブライブラリを設定してビルドする:
外部Javaプロジェクトでライブラリを使うためには、Mavenリポジトリに公開します。たとえば、 mvm ツール(別途インストール)を使用してライブラリをローカルの Maven リポジトリへ公開します:
Maven座標を使用してライブラリを参照してください。 たとえば、Mavenを使用している場合は、この依存関係を pom.xml ファイルに置きます(使用する TensorFlow ランタイムのバージョンで文字列 0.12.head を置き換えます)。
コンパイルのためにクラスパスに libtensorflow.jar を追加してください。たとえば:
実行中 libtensorflow.jar および libtensorflow_jni.so(OS Xの libtensorflow_jni.dylib )を使用可能にします。 例えば:
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の
コミュニティはもうとっくの昔に何処かへちっていってしまったのだろうか..
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 件のコメント:
コメントを投稿