Translate

2017年2月22日水曜日

TensorFlow DevSummit 2017のキーノートのスライドを切り出して、けものフレンズ風にコメントしてみる

TensorFlow DevSummit 2017の動画がこうかいされていたよ。




 なので、スライドだけをきりだしてみたんだ。

スライドだけだとさびしいので、
残念英語力でりかいしたはんいでないようをけものフレンズ風にしょーかいしてみたよ。

------

すごーい、TesnorFlowは、誰でも使えるぜえ、はやいぜえ。製品とかにも使えちゃうんだね。



たいへーん、TensorFlowがなかったころは、大変だったんだね。




TensorFlowは、バリバリの機械学習研究者向けに作られた本格的なフレンズなんだね。




すっごーい、おっきなお友達が大好きなラズパイでもうごくんだね。


たいへーん、TensorFlowは、ガッツリGoogleのサービスと癒着^H^Hフレンズなんだー。


たのしそー、TensorFlowちほーには、いろんな言語フレンズがいるんだね。


いろんなフレンズが、TensorFlowをつかってるんだね。


プログラマーのジャパリ図書館 GitHubでジャンルNo1なフレンズになったんだって。


うそじゃないよ、ほら。


フレンズのフレンズもたくさんたくさんいるんだよ。


これまで、いろんなちほーをまわってきたよね。


けもフレアプリは去年おわっちゃったんだけど、TensorFlowはいろんなものがそろったんだね。


すっごーい、betaを全然消さないのでゆうめいなGoogoleがTensorFlowはすぱっと1.0を出したんだね。



はっやーい、58倍だって。このスライドだけで記事を書くフレンズもたくさんいたよね。


なるほどー、バリバリの研究者がTensorFlowでゴリ書きして、機械学習いっちょ噛みアプリ野郎はKerasでオナ^H^H すませとけってことだね。


TensorFlowは、機械学習のいろんな計算がはやいフレンズなんだね。


古いフレンズにも、きにいられたんだね。Power AIをつかっているフレンズは絶滅していなかったんだ、よかったね、かばんちゃん。


Movidiusは、モバイルデバイスで3Dをやるのにつよいフレンズなんだって。


すっごーい、クアルコムのチップともフレンズなんだね。


たのしー、XLAをとにかく、自慢したいフレンズなんだね。


そっかー、もっとパフォーマンスで自慢したいことがあるんだー。


チュートリアルでもそうだけど、やたらInceptionV3モデルを押すフレンズなんだね。



ざんねーん、英語フランス語中国語の比較しか無いんだ。市場の小さい日本語は、ノー眼中なんだね。


たーのしー、ちょっとよくわからなかったね、このスライド。

ニューラルネットワークは、画像、音声、および自然言語の理解において、多くの困難な学習課題に対してうまく機能する強力で柔軟なモデルです。彼らの成功にもかかわらず、ニューラルネットワークはまだ設計が難しいです。本稿では、再帰的なネットワークを使用してニューラルネットワークのモデル記述を生成し、このRNNを強化学習で学習させて、検証セット上に生成されたアーキテクチャの期待精度を最大化する。 CIFAR-10データセットでは、最初から始めて、私たちの方法は、テストセットの正確さに関して人間が発明したアーキテクチャに匹敵する斬新なネットワークアーキテクチャを設計できます。当社のCIFAR-10モデルは、3.65のテストエラーレートを達成しています。これは、類似のアーキテクチャスキームを使用した従来の最先端モデルよりも0.09%優れ、1.05倍高速です。 Penn Treebankデータセットでは、我々のモデルは、広く使用されているLSTMセルや他の最先端のベースラインを上回る新しい反復細胞を構成することができます。私たちのセルは、Penn Treebank上で62.4のテストセットperplexityを達成しています。これは、以前の最先端のモデルよりも3.6の複雑さです。セルは、PTBの文字言語モデリングタスクに転送することもでき、1.214という最先端の難易度を実現します。



ジャパリバスのように、自動運転が大すきなフレンズなんだね。

Show and Tell:TensorFlowでソースを公開した画像キャプション
2016年9月22日(木曜日)
Google Brain TeamのソフトウェアエンジニアChris Shallue Google Brainチームの研究者は、2014年に画像を正確に記述するキャプションを自動的に生成する機械学習システムを訓練しました。このシステムのさらなる開発により、Microsoft COCO 2015画像キャプショニングチャレンジが成功を収めました。これは、正確な画像キャプションを計算するための最善のアルゴリズムを比較し、最初の場所に結びついています。現在、TensorFlowでは、最新のバージョンの画像キャプションシステムをオープンソースモデルとして提供しています。このリリースでは、キャプションシステムのコンピュータビジョンコンポーネントの大幅な改良が含まれており、訓練するのがはるかに高速で、元のシステムと比べてより詳細で正確な説明が得られます。これらの改善点は、Show and Tell:2015年のMSCOCO Image Captioning Challengeで学んだ教訓(パターン分析と機械インテリジェンスに関するIEEEトランザクションで発表された論文)で概説され分析されています。


プロダクション製作者(いっちょかみアプリ野郎)は、TensorFlow Serv も用意してやったから、ありがたく使えってことだね。


たーのしー、Googleアプリさえあれば、海外旅行のツアコンはぜんいんくびにしても大丈夫なんだね。


全部のフレンズにTensorFlowつかちゃうつもりなんだね。


既に、いろんなフレンズもまきこんじゃってるんだね。


おもしろーい、じゃぱりまんの原料をつくってる農場でもTensorFlowつかってるんだね。


すっごーい、貴重な技術をくだらないことに使わせることにかけたら、日本人にはかなわないなー。


事例紹介なんだね。


たいへーん、Hemorrhageって動脈出血っていみなんだってー。



よくわかんないけど、なにか自慢してるんだねー。


ネイチャーにTensorFlow(TensorBoard)が載ったんだって。フレンズのニュートンは大変みたいだけど。



会場には、たくさんのフレンズが、いっぱいいっぱいあつまったんだね。










...こりゃ、ひどい記事だ..

なんで、こんな記事かいちゃったんだろ..




 ..ボツにするか..

旧バージョンのTensorFlowコードを 1.0 で動作するように変更する

TensorFlow Dockerコンテナを作り直したら
タグlatest-py3を指定していたため、
最新のTensorFlow 1.0に変わってしまった。

0.12で動いていたコードが動作しなくなった。

実際には、

TensorFlowのSeq2Seqモデルでチャットボットっぽいものを作ってみた
http://qiita.com/sanshirookazaki/items/128bf1b5a898ad5c18f1

をちょっと手直しして動かしていたのだけど..

・パッケージ移動
  tensorflow.models.rnn.rnn_cell → tensorflow.contrib.rnn.core_rnn_cell
 tensorflow.models.rnn.seq2seq → tensorflow.contrib.legacy_seq2seq

・シグニチャ変更
 legacy_seq2seq.model_with_buckets() の引数からボキャブラリサイズが消える。
 代わりにlegacy_seq2seq.embedding_attention_seq2seq() の引数にembedding_sizeを指定する型式に。


..っていうか、Attention付きSeqence-to-Sequnece がもはや legacy_seq2seq なの?!
ってほうに驚いたが、話を戻して..

TensorFlow 1.0 になったのが2月15日だから、いろんなところで「ギャッ!」と叫んでいてもおかしくないのに..みんな静かなのは何故だろう..

なんとか楽して修正したい..とおもって本家ページを覗いてみたら

Transitioning to TensorFlow 1.0
https://www.tensorflow.org/install/migration

なるページを見つけた。

以下、勝手翻訳の内容だ。
(At your own riskで参照のこと)
---------

TensorFlow 1.0 への移行


TensorFlow 1.0のAPIは、すべて後方互換性のある方法で変更されています。 つまり、TensorFlow 0.nで動作するTensorFlowプログラムは、必ずしもTensorFlow 1.0では動作しません。 私たちは内部的に一貫したAPIを保証するためにこのAPIを変更し、1.Nのライフサイクル全体にわたって後方修正の変更を行うつもりはありません。

このガイドでは、APIの主な変更点と、TensorFlow 1.0のプログラムを自動的にアップグレードする方法について説明します。 このガイドでは、変更の手順を説明するだけでなく、変更の理由を説明します。

アップグレードする方法


コードを1.0に自動的に移植したい場合は、tf_upgrade.py スクリプトを試してみてください。 このスクリプトは多くのケースを処理しますが、手動による変更が必要な場合もあります。 このスクリプトをGitHubツリーから入手してください。


1つの 0.n TensorFlow ソースファイルを 1.0 に変換するには、次の形式のコマンドを入力します。


$ python tf_upgrade.py --infile 入力ファイル --outfile 出力ファイル

たとえば、次のコマンドは、 test.py という名前の 0.10 TensorFlow プログラムを test_1.0.py という名前の 1.0 TensorFlow プログラムに変換します:

$ python tf_upgrade.py --infile test.py --outfile test_1.0.py

たとえば、次のコマンドは /home/user/cool ディレクトリにあるすべての 0.n TensorFlow プログラムを変換し、 /home/user/cool_1.0 ディレクトリに 1.0 コードを作成します。


$ python tf_upgrade.py --intree /home/user/cool --outtree /home/user/cool_1.0


制限事項


注意すべき制限事項がいくつかあります:
 

  • tf.reverse() インスタンスは手動で修正する必要があります。 tf_upgrade.py スクリプトは stdout report.txt ファイルの tf.reverse() について警告します。
  • 並べ替えられた引数では、 tf_upgrade.py はコードの最小限の再フォーマットを試みるため、実際の引数の順序を自動的に変更することはできません。 代わりに、 tf_upgrade.py は、キーワード引数を導入することによって、関数呼び出しを順序に依存しないようにします。
  • tf.get_variable_scope().reuse_variables() のような構築はうまくいかないでしょう。 これらの行を削除し、次のような行に置き換えることをお勧めします。
   with tf.variable_scope(tf.get_variable_scope(), reuse=True):
     ...
  • tf.pack および tf.unpack と同様に、 TensorArray.pack および TensorArray.unpack は、 TensorArray.stack および TensorArray.unstack に名前が変更されました。 しかし、 TensorArray.pack および TensorArray.unpack は、それらが tf 名前空間に間接的に関連しているので、語彙的に検出することはできません。 e.g. foo = tf.TensorArray(); foo.unpack()

コードを手動でアップグレード


tf_upgrade.py を実行する代わりに、コードを手動でアップグレードすることができます。 このドキュメントの残りの部分では、 TensorFlow 1.0 で行われた後方互換性のない変更の包括的な一覧を示します。

Variables


Variable 関数はより一貫性があり、混乱も少なくなっています。
 

  • tf.VARIABLES
  • tf.GLOBAL_VARIABLES に名前を変更する必要があります。
  • tf.all_variables
  • tf.global_variables に名前を変更する必要があります。
  • tf.initialize_all_variables
  • tf.global_variables_initializer に名前を変更する必要があります。
  • tf.initialize_local_variables
  • tf.local_variables_initializer に名前を変更する必要があります。
  • tf.initialize_variables 
  • tf.variables_initializer に名前を変更する必要があります。


サマリ関数


サマリ関数は、 tf.summary 名前空間の下で統合されています。
 

  • tf.audio_summary
  • tf.summary.audio に名前を変更する必要があります。
  • tf.contrib.deprecated.histogram_summary
  • tf.summary.histogramに名前を変更する必要があります。
  • tf.contrib.deprecated.scalar_summary
  • tf.summary.scalarに名前を変更する必要があります。
  • tf.histogram_summary
  • tf.summary.histogramに名前を変更する必要があります。
  • tf.image_summary
  • tf.summary.imageに名前を変更する必要があります。
  • tf.merge_all_summaries
  • tf.summary.merge_allに名前を変更する必要があります。
  • tf.merge_summary
  • tf.summary.mergeに名前を変更する必要があります。
  • tf.scalar_summary
  • tf.summary.scalarに名前を変更する必要があります。
  • tf.train.SummaryWriter
  • tf.summary.FileWriterに名前を変更する必要があります。


数値の違い


整数除算と tf.floordiv はフローリングのセマンティクスを使用するようになりました。これは、 np.dividenp.mod の結果をそれぞれ tf.divide tf.mod と一致させるためです。さらに、 NumPy と一致させるために tf.round によって使用される丸めアルゴリズムを変更しました。

  • tf.div
  • tf.divide 除算のセマンティクスは、 Python セマンティクスに完全に一致するように変更されました。つまり、 Python3 の / と Python 2の将来の除算モードは常に浮動小数点数を生成し、 // は床除算を生成します。しかし、 tf.div でも整数床除算されます。 Cスタイルの切り捨てセマンティクスを強制するには、 tf.truncatediv を使用する必要があります。
  • プロモーションのためにPythonのセマンティクスに従った tf.divide を使用するようコードを変更することを検討してください。


  • tf.mod
  • tf.mod セマンティクスは Python セマンティクスに合わせて変更されました。特に、整数には床関数のセマンティクスが使用されます。 Cスタイルの切り捨て mod (剰余)を使いたい場合は、 tf.truncatemod を使います。

除算の古い動作と新しい動作は、以下の表のとおりです:
TF 0.11 (py2)TF 0.11 (py3)TF 1.0 (py2)TF 1.0 (py3)
tf.div(3,4)0000
tf.div(-3,4)00-1-1
tf.mod(-3,4)-3-311
-3/40-0.75-1-0.75
-3/4tf.divide(-3,4)N/AN/A-0.75-1


丸め演算(rounding)の古い動作と新しい動作は、以下の表のとおりです:

InputPythonNumPyC++ round()TensorFlow 0.11(floor(x+.5))TensorFlow 1.0
-3.5-4-4-4-3-4
-2.5-2-2-3-2-2
-1.5-2-2-2-1-2
-0.500-100
0.500110
1.522222
2.522332
3.544444

NumPyの名前マッチング


多くの関数が NumPy にマッチするように名前が変更されました。これは NumPy と TensorFlow の間の移行を可能な限り簡単にするために行われました。 関数が一致しない多くのケースがまだありますので、これは難しくて速いルールとは異なりますが、いくつかの共通の矛盾点を削除しました。
 

  • tf.inv
  • tf.reciprocal に名前を変更する必要があります。
  • これは、 NumPy の行列 inverse np.inv との混乱を避けるために行われました。

  • tf_list_diff
  • tf.setdiff1d に名前を変更する必要があります。

  • tf.listdiff
  • tf.setdiff1d に名前を変更する必要があります。

  • tf.mul
  • tf.multiply に名前を変更する必要があります。

  • tf.neg
  • tf.negative に名前を変更する必要があります。

  • tf.select
  • tf.where に名前を変更する必要があります。
  • tf.wherenp.where のように3つの引数または1つの引数をとるようになりました。

  • tf.sub
  • tf.subtractに名前を変更する必要があります。


NumPyの引数マッチング


特定の TensorFlow 1.0 メソッドの引数は、特定の NumPy メソッドの引数と一致するようになりました。 これを達成するために、 TensorFlow 1.0 はキーワード引数を変更し、いくつかの議論を並べ替えました。 特に、 TensorFlow 1.0 は次元ではなく軸を使用するようになりました。 TensorFlow 1.0 は、テンソルを変更する操作で最初にテンソル引数を保持することを目的としています( tf.concat の変更を参照してください)。

  • tf.argmax キーワード引数の次元をaxisに変更する必要があります。

  • tf.argmin
  • キーワード引数の次元をaxisに変更する必要があります。

  • tf.concat 
  • キーワード引数concat_dimの名前をaxisに変更する必要があります。
  • 引数はtf.concat(value、axis、name = 'concat')に並べ替えられています。

  • tf.count_nonzero 
  • キーワード引数reduction_indicesの名前をaxisに変更する必要があります。

  • tf.expand_dims 
  • キーワード引数のdimaxisに変更する必要があります。 

  • tf.reduce_all 
  • キーワード引数reduction_indicesの名前をaxisに変更する必要があります。

  • tf.reduce_any 
  • キーワード引数reduction_indicesの名前をaxisに変更する必要があります。 

  • tf.reduce_join 
  • キーワード引数reduction_indicesの名前をaxisに変更する必要があります。

  • tf.reduce_logsumexp 
  • キーワード引数reduction_indicesの名前をaxisに変更する必要があります。

  • tf.reduce_max 
  • キーワード引数reduction_indicesの名前をaxisに変更する必要があります。

  • tf.reduce_mean 
  • キーワード引数reduction_indicesの名前をaxisに変更する必要があります。

  • tf.reduce_min 
  • キーワード引数reduction_indicesの名前をaxisに変更する必要があります。

  • tf.reduce_prod 
  • キーワード引数reduction_indicesの名前をaxisに変更する必要があります。

  • tf.reduce_sum 
  • キーワード引数reduction_indicesの名前をaxisに変更する必要があります。 

  • tf.reverse 
  • tf.reverseはどの次元が逆転したかを制御するために1Dブールテンソルをとるのに使われました。今度は軸インデックスのテンソルを使用します。
  • たとえば、tf.reverse(a、[True、False、True])tf.reverse(a、[0、2])でなければなりません。

  • tf.reverse_sequence 
  • キーワード引数batch_dimの名前をbatch_axisに変更する必要があります。
  • キーワード引数seq_dimの名前をseq_axisに変更する必要があります。

  • tf.sparse_concat 
  • キーワード引数concat_dimの名前をaxisに変更する必要があります。

  • tf.sparse_reduce_sum 
  • キーワード引数reduction_axesの名前をaxisに変更する必要があります。

  • tf.sparse_reduce_sum_sparse 
  • キーワード引数reduction_axesの名前をaxisに変更する必要があります。 

  • tf.sparse_split 
  • キーワード引数split_dimの名前をaxisに変更する必要があります。
  • 引数はtf.sparse_split(keyword_required = KeywordRequired()、sp_input = None、num_split = None、axis = None、name = None、split_dim = None)に並べ替えられています。 

  • tf.split 
  • キーワード引数split_dimの名前をaxisに変更する必要があります。
  • キーワード引数num_splitの名前をnum_or_size_splitsに変更する必要があります。
  • 引数はtf.split(value、num_or_size_splits、axis = 0、num = None、name = 'split')に並べ替えられています。 

  • tf.squeeze 
  • キーワード引数squeeze_dimsの名前をaxisに変更する必要があります。 

  • tf.svd 
  • 引数はtf.svd(tensor, full_matrices = False, compute_uv=True, name = None)に並べ替えられています。


簡略化された数学演算


バッチバージョンの数学演算は削除されました。今や機能はバッチ処理されていないバージョンに含まれています。同様に、 tf.complex_abs はその機能を tf.abs に移動しました。

  • tf.batch_band_part
  • tf.band_partに名前を変更する必要があります。

  • tf.batch_cholesky
  • tf.choleskyに名前を変更する必要があります。

  • tf.batch_cholesky_solve
  • tf.cholesky_solveに名前を変更する必要があります。

  • tf.batch_fft
  • tf.fftに名前を変更する必要があります。

  • tf.batch_fft3d
  • tf.fft3dに名前を変更する必要があります。

  • tf.batch_ifft
  • tf.ifftに名前を変更する必要があります。

  • tf.batch_ifft2d
  • tf.ifft2dに名前を変更する必要があります。

  • tf.batch_ifft3d
  • tf.ifft3dに名前を変更する必要があります。

  • tf.batch_matmul
  • tf.matmulに名前を変更する必要があります。

  • tf.batch_matrix_determinant
  • tf.matrix_determinantに名前を変更する必要があります。

  • tf.batch_matrix_diag
  • tf.matrix_diagに名前を変更する必要があります。

  • tf.batch_matrix_inverse
  • tf.matrix_inverseに名前を変更する必要があります。

  • tf.batch_matrix_solve
  • tf.matrix_solveに名前を変更する必要があります。

  • tf.batch_matrix_solve_ls
  • tf.matrix_solve_lsに名前を変更する必要があります。

  • tf.batch_matrix_transpose
  • tf.matrix_transposeに名前を変更する必要があります。

  • tf.batch_matrix_triangular_solve
  • tf.matrix_triangular_solveに名前を変更する必要があります。

  • tf.batch_self_adjoint_eig
  • tf.self_adjoint_eigに名前を変更する必要があります。

  • tf.batch_self_adjoint_eigvals
  • tf.self_adjoint_eigvalsに名前を変更する必要があります。

  • tf.batch_set_diag
  • tf.set_diagに名前を変更する必要があります。

  • tf.batch_svd
  • tf.svdに名前を変更する必要があります。

  • tf.complex_abs 
  • tf.absに名前を変更する必要があります。


その他の変更点


次のような変更が加えられました。



  • tf.image.per_image_whitening
  • tf.image.per_image_standardizationに名前を変更する必要があります。

  • tf.nn.sigmoid_cross_entropy_with_logits 
  • 引数はtf.nn.sigmoid_cross_entropy_with_logits(_sentinel = None、labels = None、logits = None、name = None)に並べ替えられています。

  • tf.nn.softmax_cross_entropy_with_logits 
  • 引数はtf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)に並べ替えられています。

  • tf.nn.sparse_softmax_cross_entropy_with_logits 
  • 引数はtf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel = None、labels = None、logits = None、name = None)に並べ替えられています。

  • tf.ones_initializer 
  •  関数呼び出し、すなわちtf.ones_initializer()に変更する必要があります。

  • tf.pack
  • tf.stackに名前を変更する必要があります。

  • tf.round
  • tf.roundのセマンティクスは、Bankerの丸めと一致するようになりました。

  • tf.unpack
  • tf.unstackに名前を変更する必要があります。

  • tf.zeros_initializer 
  • 関数呼び出し、すなわちtf.zeros_initializer()に変更する必要があります。


以上

------

なるほど、tf_upgrade.py っていうツールを用意していたのね。
でも、それだけじゃ直しきらないからその分はココにある通り直してね..
か..

まあないよりましか。

ついでに tf_upgrade.py のありか

TensorFlow Python API Upgrade Utility
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/compatibility

のトップページだけ翻訳したのが、以下の内容。
(こちらも at your own risk でお願いします)
------

TensorFlow Python APIアップグレードユーティリティ


このツールを使用すると、既存の TensorFlow Python スクリプトをアップグレードできます。このスクリプトは単一の Python ファイルで実行できます:

$ tf_upgrade.py --infile foo.py --outfile foo-upgraded.py


修正できないエラーのリストを出力します。ディレクトリツリー上で実行することもできます。

$ tf_upgrade.py --intree coolcode --outtree coolcode-upgraded


いずれの場合も、レポートを破棄する。変更の詳細は次のようになります。

third_party/tensorflow/tools/compatibility/test_file_v0.11.py Line 125

Renamed keyword argument from `dim` to `axis`
Renamed keyword argument from `squeeze_dims` to `axis`

    Old:                   [[1, 2, 3]], dim=1), squeeze_dims=[1]).eval(),
                                        ~~~~    ~~~~~~~~~~~~~
    New:                   [[1, 2, 3]], axis=1), axis=[1]).eval(),
                                        ~~~~~    ~~~~~

警告


このスクリプトを実行する前に、コードの一部を手動で更新しないでください。特に、 tf.concat tf.split のような引数を並べ替えた関数は、引数に不一致を示すキーワード引数をスクリプトが誤って追加する原因になります。

このスクリプトは実際に引数を並べ替えません。その代わりに、スクリプトは、引数が並べ替えられた関数にキーワード引数を追加します。

このスクリプトは、すべての機能をアップグレードすることはできません。 1つの顕著な例は tf.reverse() であり、テンソルの bool ではなくインデックスのリストを取るように変更されています。スクリプトがこれを検出すると、これを stdout(およびレポート)に報告し、手動で修正することができます。たとえば、 tf.reverse(a, [False, True, True]) がある場合は、手動で tf.reverse(a, [1, 2]) に変更する必要があります。

このスクリプトは標準の Python パッケージのみを使用するように設計されているため、このスクリプトでは扱えない構文もあります。スクリプトが「必要なキーワード引数を挿入できませんでした。(A necessary keyword argument failed to be inserted.)」で失敗した場合または 「辞書検索でキーワードを見つけることができませんでした。手動で修正してください。(Failed to find keyword lexicographically. Fix manually.)}で失敗した場合、 @machrisaa's fork of this script を試してみてください。@machrisaaRedBaron Pythonリファクタリングエンジン を使用しています。このエンジンは、このスクリプトがベースになっている組み込みの @ast@ モジュールより構文要素をより確実にローカライズできます。

以上

---------

なるほど..

でも、さっきのコードは自前で直しちゃったしな..

次の機会にでも使ってみるか..




でも、TensorFlowを去年からやってる人は
Python2 → Python3 にいつ代えるか問題
という大問題をかかえてるし..

なんたってサンプルがpython2 前提が多かったもんだから
python2 ではじめた人が以外に多くって、
CentOSやUbuntuのデフォルトも python3 へうつってきているのだけど
Python2 と Python3 は文字コードの処理で動きが違うんだよなあ..
asciiコードでなんとかなる欧米人は良いだろうけど、
日本語データをコーパスにしている日本人にはキツイのよ..

でもDockerHub側も tensorflow/tensorflow に移動になったタイミングかはわからないけど、
Python3のコンテナも登場したしなあ..

しかも先日のDev Summitでしれっと、こんなのだしてたし..



これって、つまりcontribからcoreのほうへパッケージ大移動が今後も続くってことじゃん..


..やっぱKerasとEstimatorだな..

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
コミュニティはもうとっくの昔に何処かへちっていってしまったのだろうか..

2017年2月3日金曜日

IBM Watson NLC と TensorFlow で実装した簡単なCNN モデルを比較してみた


IBM Watson の NLC は
1000文字までの文章と分類名のペア
を学習データとして投入した分類器を作成できる
サービスだ。

最近は日本語書籍も出ており、
Watson Toolkitという
curlを打てなくても使えるお手軽さ
はよくできているとおもう。

NLCの裏側はオープンになっていないので
どんなアルゴリズムでどんな事前学習が行われているかは
APIを活用するユーザ側にはさっぱりわからない。

巷の評価は、いわゆるオープンなデータセットをつかっていて
それを元に比較しているので、
どうも

「催眠術師の仲間から選んだ人に催眠術を書ける術士」

みたいで眉唾だ..

ということで、
データセットをコッチで用意した。

某テキストの文章を1文づつ切り出し、
その文章の分類名を、全セクション134で切り分けてみた。

学習データ(X_train, y_train):2000件
バッチ用テストデータ(X_test, y_test):140件
評価用データ(X_eval, y_eval):55件

とかなり少ないが、
実際にNLCと
データ編集が比較的近くてやりやすい
https://github.com/tkengo/tf/tree/master/cnn_text_classification
のサンプルコードを使って
評価用データの

・正解率
 最も頻度が高い分類が合致した件数を、全質問数う(55)で割ったもの

・正解選択ヒット率
 トップ10までにある場合は、荷重づけした特点を
 F1の1位から10位までのポイント制で1を按分した数加えたスコアを、
 全質問数(55)でわったもの。

の二つを出してみた。




..正直、おはなしにならんくらい独自実装のほうが使い物にならん

どうもこのデータセットだと
分類種類の多さにくらべデータ件数が少なすぎるようで
ちっとも学習できていない..

これじゃIBM社員を、ますまずその気にさせてしまう..


でも..
箸にも某にもつかないダメデータセットでも
それなりの成績を出すNLCの事前学習度合いが
箱入り娘級の調教具合..

有償サービスにするにはこれより良い成績ださないと
話にならないか...

【ハーネスエンジニアリングを始める前に】gpt-oss:20b の入出力データから、LLMの動作を理解する

  1. はじめに 最近は、 Cursor や Antigravity などのAIエージェント前提の統合開発環境や、 Claude Desktop や Codex アプリ などのPC上のオブジェクト操作が可能なデスクトップアプリ、 Open Claw といったPC全体の...