【TensorFlow】Mac OSX El Capitan で TensorFlow に入門してみる

今回は、人工知能関連のテーマです。 Google の機械学習フレームワーク TensorFlow に触れてみようと思います。

プロローグ

人工知能の分野が盛り上がりを見せるなか、世界の名だたる研究機関やIT企業から様々な機械学習ツールがオープンソースで提供されるようになりました。これを使えば、自分にも機械学習を扱えるはず! と思いたち、Facebook の Torch 7 という機械学習フレームワークにチャレンジしたことがあります。が、チュートリアルまでやってみたところで、何が動いたのかまったく理解できず・・・あえなく挫折しました。

まだまだ素人には難しいか・・・とか思ってしょんぼりしていたのですが、それからしばらくして、世の中には日本語の情報も増えてきた様子。今度こそ自分でもできるかも! と期待に胸が震えたわけです。

今回 TensorFlow にチャレンジしようと思ったきっかけを与えてくれたのが、こちらの記事『ディープラーニングでおそ松さんの六つ子は見分けられるのか 〜実施編〜』。

この記事の前には 準備編 があり、さらに前には TensorFlow のインストールの記事『Googleの公開した人工知能ライブラリTensorFlowを触ってみた』があります。 今回は、この記事を参考に、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です。

エラーが起きる場合

他の人がインストールした記録をググって拝見すると、特に詰まることもなくできてる人もいるみたいなので、環境によるのかも知れません。が、わたしはすんなりいきませんでした。

わたしが遭遇したエラーを紹介しておきます。

El Capitan では、 SIP を解除しないとインストールが通らない

これにハマりまして・・・気づくまでにだいぶ時間がかかりました。 sudo をつけて実行しているはずなのに、Operation not permitted で怒られたら、SIPが有効になっている可能性が高いです。

ターミナルで、csrutil status を実行して SIP の状態を確認してみましょう。

$ csrutil status
System Integrity Protection status: enabled.

このように、enabled の表示がされたら、SIPが有効になっています。 SIPは次の手順で無効に設定できます。

  • Mac を再起動
  • リカバリモードで起動する(起動画面で Cmd+R を押しっぱなし)
  • ユーティリティ->ターミナル でターミナルを開く
  • ターミナルが起動したら、$ csrutil disableで無効に設定する。
  • $ reboot (Mac を再起動)します。

SIPを無効にしてから、インストールコマンドをもう一度実行すれば、今度は成功すると思います。

ちなみに、インストールが成功したあとは、SIPを有効化しても、使う上では問題なさそうです。

$ csrutil enable

Macにプレインストールされている numpy を参照してしまい、バージョンが合わない

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 のサンプルを実行してみる

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/

TensorBoardで学習状況を可視化

TensorFlow に同梱されている TensorBoard というアプリケーションで、学習状況をグラフィカルに確認することができます。

$ tensorboard --logdir=./data

--logdir オプションに指定しているのは、チュートリアルを実行した結果生成された data/ ディレクトリへのパスです。このコマンドを実行すると、ポート番号 6006 でウェブサーバーが起動します。

http://localhost:6006/ にブラウザでアクセスすると、こんな感じの画面が表示されました。

TensorBoard image 1

以前、Torch 7 のチュートリアルをやったときにも、このグラフに似た画像が出力されました。当時は英語のドキュメントを読んでも、このグラフの意味が何なのかわからず挫折しましたが、いま改めて参考記事の説明を読むと、学習を繰り返すごとに loss(=不正解) が減っていく様を表したグラフだということです。

これがわかっただけで前進した気がします。日本語は偉大です。

GRAPH のページはこんな画面です。

TensorBoard image 2

参考記事の説明によれば、ニューラルネットワークのグラフ化 だそうです。TensorFlowはこのGRAPH機能がすばらしい!と絶賛されているようなので、きっと画期的なのでしょう。

が、いまの私にはまだ全然意味がわかっておりません。(;^_^A

まとめ

今回やったこと、わかったことをまとめてみます。

  • Google製の機械学習フレームワーク TensorFlow をインストールした。
  • TensorFlow は、Ubuntu/Linux と Mac OSX で動作する。Windowsでも動きそうだが大変そう。
  • Mac OSX El Capitan にインストールする際は、SIPをオフにしないといけない。
  • TensorFlowに同梱されている MNISTのサンプルを実行してみた。
  • MNIST(手書き数字認識)は、機械学習界では Hello World 的な入門課題らしい。
  • サンプルを実行した結果出力されたグラフは、学習が進むごとに loss(不正解)の率が減っていく様を表していることを知った。
  • TensorBoard は画期的らしい。

まだ全然理解できた部分は少ないですが、日本語のドキュメントがすごく増えてきているので、素人の私でも頑張ればなんとか使えそうな予感がします。

※私は機械学習についてもPythonについても素人ですので、この記事に間違いなどあるかも知れません。もし間違いがありましたらごめんなさい&親切な詳しい方ご指摘いただけたら嬉しいです。

次はこの TensorFlow を使って、おそ松さんの準備編実施編 を参考に、画像判別ツールの作り方を学んでみたいと思います。

以下は、関連リンクなど。

公開日:2015年12月16日(Wed)


プロフィール

ときにはデザイナ、ときにはディレクタ、ときにはプログラマ、ときには何でも屋と、ウェブの世界で未熟ながらもいろいろやっている、コヤナギトモヤです。

ツイッター上ではこのヒト。
@tomk79

RSSフィード

ページの先頭へ戻る