ワタナベ書店

読んだ本の感想とか美味しかったお店の紹介とかLinuxの知見とか好きなことを好きなだけ書くブログです。

Mac OS XにTensorflowをインストールして、Hello worldまでやってみる

TensorFlow(テンソルフロー)とは

Gooleが開発したオープンソース機械学習のライブラリです。

TensorFlowの特長として次のような点があります。

  • CPUとGPUでコードの変更が不要で手元のPCでもデータセンタでも同じコードで動く
  • GitHubのStar数が機械学習系プロジェクトの中でもトップ(さすがGoogle)でデファクトスタンダードになりつつある
  • すでにGoogle内ではたくさんのプロダクトで使用されており、実際に効果があがっている

ということで、すでに実用に使われているオープンソース機械学習ライブラリってことです。
最近ではAlpha Goという囲碁のプログラムにも使用され、囲碁のプロを破ったこともありました。

Qiitaにもいくつも投稿があり、株価予想や画像認識など面白そうな解説がたくさんあります。

そんなTensorFlowをインストールして、Hello worldまで動かしてみようとおもいます。
公式のインストールを読むとLinuxもしくはMac OS Xでの動作を案内しており、どちらかでやってみるのが簡単でしょう。
今回はMac OS XでTensorFlow CPU版(CPUパワーのみで機械学習を行うTensorFlow)をインストールします。

インストール方法

基本的に公式サイトのインストール方法(Virtualenv install)を参考にしています。
もし、このインストールで失敗する場合は公式サイトのコマンドを信用してください。

OSXにデフォルトでインストールされているpythonで、Virtualenvという仮想環境を作れるモジュールの上に、TensorFlow環境を構築していきます。
Virtualenvで作ることによって、アンインストールがとても容易になります。

pip(pythonのパッケージインストールシステム)とVirtualenvのインストール

$ python -V
Python 2.7.10
$ sudo easy_install pip
$ sudo pip install --upgrade virtualenv

TensorFlow環境を構築する準備

$ mkdir ~/tensorflow
$ virtualenv --system-site-packages ~/tensorflow

TensorFlow環境に入り、構築
TensorFlow環境に入ると、プロンプトに(tensorflow) $と表示されるようになります。

$ source ~/tensorflow/bin/activate
(tensorflow) $ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.8.0-py2-none-any.whl
# Successfully installed numpy-1.11.0 protobuf-3.0.0b2 tensorflow-0.8.0 って出たら成功です。

TensorFlow環境に入ったり出たりする

(tensorflow) $ deactivate
# 出るとプロンプトが戻ります
$ source ~/tensorflow/bin/activate
# 入ると先ほどと同じようになります

これでインストールは終わりです。

Hello world

TensorFlowが正常にインストールされたかどうか、TensorFlowを使った簡単なプログラムを書いて試してみます。

$ source ~/tensorflow/bin/activate
# TensorFlow環境に入ると (tensorflow) $ってターミナルが変化します
(tensorflow) $ vi helloworld.py

次のコードをコピペ

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print sess.run(hello)

Hello worldを実行

(tensorflow) $ python helloworld.py
Hello, TensorFlow!

ということで、Hello worldが表示されTensorFlow環境が実行可能なことが確認されました。

さて、これだけではつまらないのでカーブフィッティングのプログラムを試してみます。
y = x * 0.1 + 0.3 の数直線上にランダムに100個の点を設置し、
それをTensorFlowを使って方程式 y = x * w + bの定数wとbを推測させてみます。(TensorFlowプログラムはw=0.1、b=0.3であることを知らない)
使用するアルゴリズム確率的勾配降下法というものです。 簡単に言うと、定数wとbを最初はランダムに設定し、そこから求められた値と現実の値の差を微分を利用して0に近づけようとするアルゴリズムです。

(tensorflow) $ vi gd.py

次のコードをコピペ

import tensorflow as tf
import numpy as np

# Create 100 phony x, y data points in NumPy, y = x * 0.1 + 0.3
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3

# Try to find values for W and b that compute y_data = W * x_data + b
# (We know that W should be 0.1 and b 0.3, but Tensorflow will
# figure that out for us.)
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + b

# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# Before starting, initialize the variables.  We will 'run' this first.
init = tf.initialize_all_variables()

# Launch the graph.
sess = tf.Session()
sess.run(init)

# Fit the line.
for step in xrange(201):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(W), sess.run(b))

# Learns best fit is W: [0.1], b: [0.3]

実行

(tensorflow) $ python gd.py
(0, array([ 0.11945292], dtype=float32), array([ 0.37063468], dtype=float32))
(20, array([ 0.09696758], dtype=float32), array([ 0.30144662], dtype=float32))
(40, array([ 0.09920744], dtype=float32), array([ 0.30037808], dtype=float32))
(60, array([ 0.09979286], dtype=float32), array([ 0.30009884], dtype=float32))
(80, array([ 0.09994586], dtype=float32), array([ 0.30002585], dtype=float32))
(100, array([ 0.09998585], dtype=float32), array([ 0.30000675], dtype=float32))
(120, array([ 0.09999631], dtype=float32), array([ 0.30000177], dtype=float32))
(140, array([ 0.09999906], dtype=float32), array([ 0.30000046], dtype=float32))
(160, array([ 0.09999975], dtype=float32), array([ 0.30000013], dtype=float32))
(180, array([ 0.0999999], dtype=float32), array([ 0.30000007], dtype=float32))
(200, array([ 0.0999999], dtype=float32), array([ 0.30000007], dtype=float32))

ということで、w=0.0999999、b=0.30000007と本来の数値(w=0.1、b=0.3)に近似しているので成功といえます。

アンインストール方法

(tensorflow) $ deactivate
$ cd ~/
$ sudo rm -rf tensorflow

インストールしたフォルダ以下を削除すればおしまいです。普通にFinderから削除しても問題ありません。

もっと深く学びたい場合

機械学習を勉強したいなら、次の本がおすすめです。
著者の中井悦司さんがブログでこの本を交えつつ、TensorFlowの解説をしているのでここから勉強してみるのも良いと思います。

ITエンジニアのための機械学習理論入門

ITエンジニアのための機械学習理論入門