公開日: 2015年12月16日(Wed)
今回は、人工知能関連のテーマです。 Google の機械学習フレームワーク TensorFlow に触れてみようと思います。
人工知能の分野が盛り上がりを見せるなか、世界の名だたる研究機関やIT企業から様々な機械学習ツールがオープンソースで提供されるようになりました。これを使えば、自分にも機械学習を扱えるはず! と思いたち、Facebook の Torch 7 という機械学習フレームワークにチャレンジしたことがあります。が、チュートリアルまでやってみたところで、何が動いたのかまったく理解できず・・・あえなく挫折しました。
まだまだ素人には難しいか・・・とか思ってしょんぼりしていたのですが、それからしばらくして、世の中には日本語の情報も増えてきた様子。今度こそ自分でもできるかも! と期待に胸が震えたわけです。
今回 TensorFlow にチャレンジしようと思ったきっかけを与えてくれたのが、こちらの記事『ディープラーニングでおそ松さんの六つ子は見分けられるのか 〜実施編〜』。
この記事の前には 準備編 があり、さらに前には TensorFlow のインストールの記事『Googleの公開した人工知能ライブラリTensorFlowを触ってみた』があります。 今回は、この記事を参考に、TensorFlowのインストールを進めてみたいと思います。
参考記事では、Ubuntu 14.04 にインストールする手順になっていますが、今回は、 Mac OSX 10.11.1 El Capitan に TensorFlow をインストールします。
TensorFlowのインストールに pip
を使います。pip
は、Python のパッケージ管理ツールだそうです。 pip
が入っていない場合は、先に下記のコマンドでインストールします。
$ sudo easy_install pip
$ pip --version
pip 7.1.2 from /Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg (python 2.7)
インストールされた pip
のバージョンは 7.1.2 でした。ちなみに Python は Mac にもともと入っていたバージョンで、2.7.10 です。
pip
が使える準備ができたら、下記のコマンドでインストールを実行します。
$ sudo easy_install --upgrade six
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.6.0-py2-none-any.whl
このコマンドは公式からの転載です。pip
を使う以外の方法もあるようなので、詳しくは公式のドキュメントを参照してください。
ぱっと見、Ubuntu と Mac OSX のインストールコマンドは見当たりますが、Windowsの話が載っていないので、Windowsはオススメじゃないのかもです。一応、動くぽいやりとりがフォーラムにありましたので、参考までに。
pip list
コマンドで、pip が管理しているパッケージのバージョンを確認できます。
わたしの環境では、バージョンは次のようでした。(主に関連してそうなパッケージだけ書いています)
$ pip list
(中略)
numpy (1.10.1)
pip (7.1.2)
(中略)
six (1.10.0)
tensorflow (0.6.0)
(中略)
python
コマンドで、import tensorflow as tf
を実行して、エラーが起きなければOKです。
他の人がインストールした記録をググって拝見すると、特に詰まることもなくできてる人もいるみたいなので、環境によるのかも知れません。が、わたしはすんなりいきませんでした。
わたしが遭遇したエラーを紹介しておきます。
これにハマりまして・・・気づくまでにだいぶ時間がかかりました。
sudo
をつけて実行しているはずなのに、Operation not permitted
で怒られたら、SIPが有効になっている可能性が高いです。
ターミナルで、csrutil status
を実行して SIP の状態を確認してみましょう。
$ csrutil status
System Integrity Protection status: enabled.
このように、enabled
の表示がされたら、SIPが有効になっています。 SIPは次の手順で無効に設定できます。
$ csrutil disable
で無効に設定する。$ reboot
(Mac を再起動)します。SIPを無効にしてから、インストールコマンドをもう一度実行すれば、今度は成功すると思います。
ちなみに、インストールが成功したあとは、SIPを有効化しても、使う上では問題なさそうです。
$ csrutil enable
TensorFlow は numpy
というライブラリに依存しており、インストール時に新しいバージョンの numpy
が一緒にインストールされます。 pip
で新しい numpy
をインストールしても、プレインストールされている古い numpy
がロードされてしまい、適合せずエラーが起きます。
プレインストールの numpy
は /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy
にインストールされているようなので、これをリネームなどすると、pip
で入れた方の numpy
が参照されるようになりました。
(Pythonにあまり詳しくないので、この手順が妥当かどうか微妙ですが。一応これで動きました)
$ cd /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
$ sudo mv numpy numpy.bak20151214
ちなみに、Mac OSX El Capitan では、この操作も SIP を解除しないと実行できません。
そしたら、一応 $ pip install
して numpy
を入れなおしておけば問題ないと思います。(今回は、いろいろ試行錯誤してしまったので、この操作は必要かどうかわかりません)
$ pip install --upgrade numpy
MNISTは、手書きの数字を判別するもので、機械学習の世界では Hello World 的な、初心者向けの定番の課題だそうです。
TensorFlow のリポジトリに、MNISTのチュートリアルが含まれているので、これを実行してみます。
まずは git clone
。
$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow
MNISTのチュートリアルスクリプトは、tensorflow/examples/tutorials/mnist/fully_connected_feed.py
に格納されていました。このパスは、記事によって違ったりしており、変更されたりしてるようです。2015-12-14 時点のバージョンではこのパスにありましたが、また変更されて見つからないときは、リポジトリ内を検索してみてください。
これを実行します。
$ python tensorflow/examples/tutorials/mnist/fully_connected_feed.py
すると、
Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz
I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 4
I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 4
Step 0: loss = 2.30 (0.017 sec)
Step 100: loss = 2.18 (0.009 sec)
Step 200: loss = 1.96 (0.007 sec)
Step 300: loss = 1.72 (0.010 sec)
Step 400: loss = 1.49 (0.008 sec)
Step 500: loss = 0.99 (0.007 sec)
Step 600: loss = 1.04 (0.009 sec)
Step 700: loss = 0.71 (0.007 sec)
Step 800: loss = 0.79 (0.007 sec)
Step 900: loss = 0.64 (0.007 sec)
Training Data Eval:
Num examples: 55000 Num correct: 46783 Precision @ 1: 0.8506
Validation Data Eval:
Num examples: 5000 Num correct: 4305 Precision @ 1: 0.8610
Test Data Eval:
Num examples: 10000 Num correct: 8605 Precision @ 1: 0.8605
Step 1000: loss = 0.37 (0.019 sec)
Step 1100: loss = 0.51 (0.139 sec)
Step 1200: loss = 0.42 (0.007 sec)
Step 1300: loss = 0.55 (0.007 sec)
Step 1400: loss = 0.41 (0.007 sec)
Step 1500: loss = 0.43 (0.006 sec)
Step 1600: loss = 0.29 (0.007 sec)
Step 1700: loss = 0.40 (0.007 sec)
Step 1800: loss = 0.33 (0.014 sec)
Step 1900: loss = 0.33 (0.007 sec)
Training Data Eval:
Num examples: 55000 Num correct: 48958 Precision @ 1: 0.8901
Validation Data Eval:
Num examples: 5000 Num correct: 4483 Precision @ 1: 0.8966
Test Data Eval:
Num examples: 10000 Num correct: 8946 Precision @ 1: 0.8946
こんな感じのメッセージがターミナルに流れて終了しました。
中身や意味はよくわかりませんが、おそらく、THE MNIST DATABASE というサイトのデータベースから、手書き数字画像のサンプルを取得し、そのうちのいくつかを学習用、いくつかをテスト用として機械学習エンジンに与えるような処理になっているのではないかと思います。
次のようなファイルとディレクトリが新しく生成されました。
checkpoint
data-1999
data-999
data/
TensorFlow に同梱されている TensorBoard というアプリケーションで、学習状況をグラフィカルに確認することができます。
$ tensorboard --logdir=./data
--logdir
オプションに指定しているのは、チュートリアルを実行した結果生成された data/
ディレクトリへのパスです。このコマンドを実行すると、ポート番号 6006 でウェブサーバーが起動します。
http://localhost:6006/ にブラウザでアクセスすると、こんな感じの画面が表示されました。
以前、Torch 7 のチュートリアルをやったときにも、このグラフに似た画像が出力されました。当時は英語のドキュメントを読んでも、このグラフの意味が何なのかわからず挫折しましたが、いま改めて参考記事の説明を読むと、学習を繰り返すごとに loss(=不正解) が減っていく様を表したグラフだということです。
これがわかっただけで前進した気がします。日本語は偉大です。
GRAPH のページはこんな画面です。
参考記事の説明によれば、ニューラルネットワークのグラフ化 だそうです。TensorFlowはこのGRAPH機能がすばらしい!と絶賛されているようなので、きっと画期的なのでしょう。
が、いまの私にはまだ全然意味がわかっておりません。(;^_^A
今回やったこと、わかったことをまとめてみます。
まだ全然理解できた部分は少ないですが、日本語のドキュメントがすごく増えてきているので、素人の私でも頑張ればなんとか使えそうな予感がします。
※私は機械学習についてもPythonについても素人ですので、この記事に間違いなどあるかも知れません。もし間違いがありましたらごめんなさい&親切な詳しい方ご指摘いただけたら嬉しいです。
次はこの TensorFlow を使って、おそ松さんの準備編、実施編 を参考に、画像判別ツールの作り方を学んでみたいと思います。
以下は、関連リンクなど。
公開日: 2015年12月16日(Wed)