Tensorflowとkerasを触ってみた


*** 8/25に開催した [Tensorflow勉強会@本町](http://events.lmlab.net/events/136) の概要です。 ***

## GCPとは？
Google Cloud Platformの略です。AWS(Amazon Web Services)のGoogle版ですね。課金体系がややこしくてちょっと使うの怖かったりするんですが、サーバを作るのがとっても楽なのと、将来的にML Engine(Tensorflowのモデルを構築してくれるサービス)なんかも試してみたいのとで今回はこれを選びました。

https://cloud.google.com/


## Compute Engineのインスタンスを作る
今回はシンプルな仮想マシンにtensorflowをインストールして動かしてみたいと思います。

新しいインスタンスを作成します。Boot diskには「Ubuntu 17」を選びました。

![Screen Shot 2017-08-21 at 11.37.55.png](https://qiita-image-store.s3.amazonaws.com/0/50780/9a459eb5-b97d-50ce-891f-ef2ac0d4f5c7.png "Screen Shot 2017-08-21 at 11.37.55.png")

作成後に割り当てられる「External IP」を使ってこのインスタンスにアクセスします（以降 YOUR_IP と書かれた箇所をここで手に入れたIPに置き換えてください）。

## Ubuntuのセットアップ
まずはsshでログインします。

```
ssh ubuntu@YOUR_IP
```

必要なパッケージのインストールをします。

```
sudo -i
apt -y update
apt -y upgrade

apt -y install python3-pip python3-dev
pip3 install --upgrade pip
pip3 install opencv-python tensorflow
exit
```

今回はPython3(2.xではなく)でtensorflowが動作するようにパッケージ導入しています。
以下のようにライブラリが正常にロード可能か確認してください。

```
$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> node1 = tf.constant(3.0, dtype=tf.float32)
>>> node2 = tf.constant(4.0) # also tf.float32 implicitly
>>> print(node1, node2)
Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)
>>> 
```

- 参考: https://www.tensorflow.org/get_started/get_started


## Tensorflowを動かして見る
Tensorflowのインストールは完了していますが、チュートリアルのコードが欲しいので、ソースコードをGitHubから取得します。

```
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow/tensorflow/examples/tutorials/mnist/
```

一番簡単なサンプルはこちら。mnist(手書き文字)の学習と評価用のデータセットをインターネットからダウンロードしてくれて、さらに一瞬でモデルの構築と評価が完了します。

```
python3 mnist_softmax.py
```

このプログラムの中身については、以下のURLなどを参照してみてください。
（理論は苦手なので、この辺からどう実用するかという話題に逃げる…）

- https://www.tensorflow.org/get_started/mnist/beginners ([翻訳版](http://qiita.com/KojiOhki/items/ff6ae04d6cf02f1b6edf))
- https://www.tensorflow.org/get_started/mnist/pros
- https://www.tensorflow.org/get_started/mnist/mechanics


## 画像認識で遊んでみる
（作りかけでちょっと使い勝手が悪いです）
ブラウザから画像をサーバにアップロードするとtensorflowを起動して画像を分類した結果を表示してくれるアプリを作りました。また、tensorflowのサンプルコードではモデルを保存せずにそのまま評価して終わってしまっているので、Saverを使ってモデルを保存するよう改造したコードも置いてあります(train-*.py)。

```
git clone https://github.com/lumbermill/takachiho.git
sudo apt install apache2 php rake
cd ~/takachiho/webapps/01-tensorflow
# phpを配備
rake install
# モデルを構築して配備
cd ~/takachiho/raspi/07-coffee
python3 train-mnist1.py --data_dir=/tmp/tensorflow/mnist/input_data/ --log_dir=/var/www/html/tensorflow/models/
```

画面はこんな感じ。ソースコードに興味がある方は上記リポジトリから参照してください。

![Screen Shot 2017-08-27 at 8.30.56.png](https://qiita-image-store.s3.amazonaws.com/0/50780/bb6f10e0-0233-949d-7603-8345d6b049f7.png "Screen Shot 2017-08-27 at 8.30.56.png")

## kerasの構築済みモデルを試してみる
まずはインストールとサンプルプログラムのダウンロード。

```
sudo pip3 install keras h5py
curl -O https://raw.githubusercontent.com/asataniAIR/Image_DL_Tutorial/master/VGG/VGG16_Demo.py
```

引数に画像を指定すると、それが何であるかを類推してくれます。簡単！

```
$ python3 VGG16_Demo.py sample.jpg
Using TensorFlow backend.
:
中略
:
('n03947888', 'pirate', 0.98744524)
('n04147183', 'schooner', 0.010494102)
('n04606251', 'wreck', 0.0010530388)
('n03240683', 'drilling_platform', 0.00052914425)
('n03344393', 'fireboat', 0.00010963867)
```

## その他
（あんまり詳細まで踏み込めなかったキーワード）

- Softmax regression?
- ML Engine?
- Tensorboard?


## 関連リンク
- [TensorflowのiOSデモをビルドする](http://qiita.com/lumbermill/items/767ef1420dabffc776af)