ページトップへ
2015年11月10日に、Googleの機械学習/ディープラーニングライブラリの「TensorFlow(テンソルフロー)」が公開され、それから1年が経ちました。「TensorFlow」は、Googleの検索やメール分類、メール返信文の自動作成、画像検索、音声認識等に使用されているものです。TensorFlowは、CPUで演算処理する以外に、GPUあるいはCPUとGPUの併用で高速に演算処理することができます。GPUを使った方が大量に高速に処理することができます。最近は、2016年11月17日にIntel社とGoogle社が、TensorFlow含めてAIとIoT分野で戦略的提携を発表しました。よくIBM Watsonと競合すると言われるようですが、その表現は間違っています。正確にはWatsonの一部の機能と類似あるいは競合していると言った方が良いでしょう。

今回は、GPUを用いずに、より身近なCPU版のTensorFlowをBluemix Infrastructure(略称:Bluemix IaaS, 旧SoftLayer)にインストールしてみます。なお、TensorFlowは、CHANGE-MAKERS内の記事でも紹介されたことがあります。

使用環境

使用クラウド:Bluemix Infrastructure(旧SoftLayer)
種別:Cloud Server パブリック
OS:Ubuntu14.04 64bit Minimal
CPU:2コア以上
メモリ:2GB以上
ストレージ:25GB以上
IPアドレス:パブリック IP と プライベート IP を1つずつ
ネットワーク速度:100 Mbps以上

インストール

インストール用シェルスクリプトを作成します。幾つかあるインストール手段のうち、今回は「pip」によるインストールを用います。
シェルスクリプトを使って、必要なソフトウェアをインストールします。nanoはテキストエディタです。nanoが入っていない場合は、vi を使用します。
nanoが使える場合は、下記をコピー&ペーストして、Ctrlキー + xキーを押し、yキーで保存します。
viを使用している場合は、iキーで入力モードに切り替えて下記をコピー&ペースト、Escキーを押してコマンドモードへ。:wq(コロンダブリューキュー)キーで保存します。このシェルスクリプトを実行すると、nanoが入っていない場合は、nanoが利用できるようになります。
# nano setup.sh
下記をコピー&ペーストします。Ubuntu14.04には、Python2.7系が入っていますので、TensorFlowのPython2.7版の最新版をGithubで確認して入れます。
#!/bin/bash
apt-get update && apt-get upgrade -y
apt-get install wget unzip nano software-properties-common curl git python-pip python-dev -y
echo "Asia/Tokyo" | tee /etc/timezone
dpkg-reconfigure --frontend noninteractive tzdata
pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0-cp27-none-linux_x86_64.whl
ufw allow 22/tcp
ufw allow 6006/tcp
権限を変更し、シェルスクリプトを実行します。
# chmod a+x setup.sh
# ./setup.sh
ファイアウォールを起動します。実行後、yをクリックして再起動します。
# ufw enable
# reboot
再度サーバーに接続して、TensorFlowのインストール先を確認しましょう。
# python -c 'import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))'
/usr/local/lib/python2.7/dist-packages/tensorflow に入っているようです。
検出したディレクトリに移動します。
# cd /usr/local/lib/python2.7/dist-packages/tensorflow


チュートリアルを試す

一番シンプルな「手書き数字認識(MNIST)」のチュートリアルを実行します。
下記コマンドを実行すると、データソースをダウンロードし、0~9の手書き文字が数字であることを学習することを開始します。データソースは、手書き数字データは、28ピクセル×28ピクセルの白黒で、55,000ポイントの手書き数字画像による学習データ、10,000ポイントのテストデータ、5000ポイントの検証データで構成されています。
# python -m tensorflow.models.image.mnist.convolutional
実行結果が下記になります。CPU2コアで1時間かかりました。実用にはCPUは8コア以上が望ましいでしょう。
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
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
Initialized!
Step 0 (epoch 0.00), 14.1 ms
Minibatch loss: 12.054, learning rate: 0.010000
Minibatch error: 90.6%
Validation error: 84.6%
Step 100 (epoch 0.12), 432.3 ms
Minibatch loss: 3.286, learning rate: 0.010000
Minibatch error: 6.2%
Validation error: 7.0%
~~ 中略 ~~
Step 8300 (epoch 9.66), 432.2 ms
Minibatch loss: 1.612, learning rate: 0.006302
Minibatch error: 0.0%
Validation error: 0.9%
Step 8400 (epoch 9.77), 440.6 ms
Minibatch loss: 1.596, learning rate: 0.006302
Minibatch error: 0.0%
Validation error: 0.7%
Step 8500 (epoch 9.89), 442.7 ms
Minibatch loss: 1.603, learning rate: 0.006302
Minibatch error: 0.0%
Validation error: 0.9%
Test error: 0.8%
学習の結果、最初は高かったエラー率が低くなったことがわかります。今回のCPU2コアの環境では、エラー率0.8%になっています。

まとめ

機械は読み込んだデータから、データの方向(点やはらいなど)や座標といった情報と大量の似たようなデータを読み込んで、数字かそうでないか判断します。私たち人間は、機械のような処理を脳が一瞬で処理してくれるため、手書き数字の画像データが数字であるとすぐに認識できます。
地道に機械に学習させることで、既に採用事例がありますように野菜や果物のランク判定、建物や倉庫に入ってくる人や物の識別などに役立てることができることを、手書き数字認識のサンプルにより、想像できることでしょう。
TensorFlow」には、まだまだチュートリアルがありますので、今後も試してみたいと思います。