Googleが人工知能・機械学習ソフトウェアTensorFlowをオープンソース化したので、触ってみたいと思います。
ubuntu 14.04LTS 64bit
OSによって方法が変わります。詳細はここを参照して下さい。
まず,pip
をインストールしてください.
pipはPythonで書かれたパッケージソフトウェアをインストール・管理するためのパッケージ管理システムである.
# Ubuntu/Linux 64-bit
$ sudo apt-get install python-pip python-dev
次にTensorFlow
をインストールします.
# For CPU-only version
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
# For GPU-enabled version (only install this version if you have the CUDA sdk installed)
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
VirtualEnvを使用したインストールを推奨していたため、再度インストールしました.
※VirtualEnv:Pythonの仮想環境を提供するもの.
$ sudo apt-get install python-pip python-dev python-virtualenv
次に,virtualenvの環境設定を行います.
$ virtualenv --system-site-packages ~/[ディレクトリ名]
$ cd ~/[ディレクトリ名]
virtualenvをアクティブにするには以下のコマンドを用います。
$ source ~/[ディレクトリ名]/bin/activate # If using bash
$ source ~/[ディレクトリ名]/bin/activate.csh # If using csh
(tensorflow)$ # Your prompt should change
virtualenv内でTensorFlowをインストールします。
(tensorflow)$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl
もし,ここからcloneしてきたのであればインストール中に
誤ったインタプリタです
と怒られると思います.
その時はtensorflow/bin
にあるpip
を次のように書き換えてください.
#befor
#!/home/shimadakento/tensorflow/bin/python
#after
#!/home/[ユーザー名]/[ディレクトリ名]/bin/python
python terminalを開きます。
$ python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print sess.run(hello)
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print sess.run(a+b)
42
>>>
上記のように動けばインストール成功です。
TensorFlowの使い方を覚えるために、チュートリアルをやっていきます。
以下,ソースコードです.詳細は後述します.
# -*- coding: utf-8 -*-
import input_data
import tensorflow as tf
# MNISTのデータセットのダウンロードと読み込み
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# シンボリック変数
x = tf.placeholder("float", [None, 784])
# 重みとバイアスを表す変数を用意
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
# softmaxの計算
y = tf.nn.softmax(tf.matmul(x,W) + b)
# 訓練時に真のラベルの値を入れるための変数
y_ = tf.placeholder("float", [None,10])
# 交差エントロピーの計算
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
# 学習方法の定義(ステップサイズ0.01の勾配法で交差エントロピーを最小化)
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
# セッションの準備
sess = tf.Session()
# 変数の初期化
init = tf.initialize_all_variables()
sess.run(init)
for i in range(1000):
# 使用するデータの選択
batch_xs, batch_ys = mnist.train.next_batch(100)
# 勾配を用いた更新
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
# 正答率の計算
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
# 結果の出力
print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
まず手書き数字認識のチュートリアルを始める前に,
使用するデータセットをインポートする必要があります.
そこで,ここのコードをinput_data.py
で同じディレクトリに保存してください.
これで,以下のコードでMNISTデータをインポートできるようになります.
import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
すべてのMNISTデータは2つの部分(画像とラベル)からなっており,ここでは
画像をxs
,ラベルをys
と呼びます.例えば,訓練画像はmnist.train.images
,訓練ラベルはmnist.train.labels
となっています.
このチュートリアルでは簡単のため画像データを28281=784の数値, つまり二次元の数字の集まりを横一列に並べたものとしている.
mnist.train.images
は[55000, 784]の配列,mnist.train.labels
は[55000, 10]の配列です.
例えば,3というラベルは[0,0,0,1,0,0,0,0,0,0]と表される.
softmax回帰はいくつかの異なるものの一つであるオブジェクトに確率を割り当てたいときに用いられます.
ソフトマックス回帰は,次の2ステップで行われます.
- 特定のクラスに含まれる入力のevidenceを合計する.
- evidenceを確率に変換する.
与えられた画像が特定のクラスに含まれるというevidenceを総計するためにピクセル強度 の加重和を計算します.高い強度を持つピクセルがそのクラス内の画像に反するevidence であるならば,重みは負となります.一方で,合致すようなevidenceであれば正となります.
具体的には重みは[784, 10]のテンソルであり,画像中の1pixelが09である可能性を
表しています.例えば,先の1の画像の場合,左上のpixelは[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
となることが多く,これは左上のpixelが09のいずれにも影響を及ぼさないことから明らかです.
次の画像はあるモデルがこれらのクラス各々から学んだ重みを示しています.ここで, 赤は負,青は正の重みを表します.
また,バイアスと呼ばれるevidenceも加えます.その結果evidenceは次ように表されます.
ここで,wは重み,biはクラスiのバイアス,jは入力画像x内のピクセルを加算するための
インデックスです.そして,計算されたevidenceを予測される確率にsoftmax関数
によって変換します.
ここでソフトマックスは線形関数の出力を望みの形に整形する 「活性化」あるいは「リンク」関数として振る舞います (今回のケースでは10個の数字の確率分布). evidenceの合計を入力が各クラスに含まれる確率に変換するものと考えることができ, 次の式で定義されます.
また,式を拡張すると次式が得られます.
10個の出力の総和が1となることで確立と解釈することが可能になります.
exp()関数は,値がマイナスにならないように使用され,これにより値がマイナスにならず,
かつ総和が1となるため確率と解釈ができます.
ソフトマックス回帰は次のように表現できます.
方程式として書くならば次のように表現できます.
行列とベクトルを用いると
となり,まとめると
と表現できます.