MaruLabo × TFUG 資料 (古川新)

# 本日はハンズオンですが…

---

# ソースコードは書かせません！

---

# 時間が足りない

実際に書くのはただの作業。コピペだっていいんです。

今日は「クラウドでの動かし方」と「プログラムの雰囲気」、を知る

そして「**実際に体験する**」ことを目的とします。
今日は、そのためのサンプルを用意しましたので、動かしてみましょう。

---

# サンプルアプリのインストール

```
# ダウンロード
cd ~
wget https://github.com/ornew/mnist-visual/releases/download/v2.1.2/mnist-visualize-example_2.1.2.tar.gz

# 展開
tar zxvf mnist-visualize-example_2.1.2.tar.gz
cd ~/mnist-visualize-example_2.1.2/

# 起動
sudo python server.py -p 80
```

---

# このアプリについて

このアプリは、TensorFlowチュートリアル「Deep MNIST for Experts」（[原文](https://www.tensorflow.org/versions/r0.11/tutorials/mnist/pros/)｜[翻訳](http://ornew.net/tensorflow-deep-mnist-for-experts)）のMNISTモデルの学習状況をブラウザで閲覧できるようにしたものです。

---

- サーバを起動したのち、GCEインスタンスのIPアドレスにブラウザでアクセスしてください。
- Chrome,FireFox,Safariで動作を確認しています。

ブラウザでアクセスしたら「訓練を開始する」というボタンを押してください。少し待っているとテスト結果が表示され始めます。

学習がどうやって進んでいくのかを観察してみてください。

---

# テスト結果の見方

- 緑→テストで正解したもの
- 赤→テストで間違えたもの

![スクリーンショット 2017-01-16 13.59.17.2.png](https://qiita-image-store.s3.amazonaws.com/0/143108/cfab7938-0dcc-9395-119d-72aab9846faf.png)

---

- どの数字とどの数字を間違えやすいでしょうか。
- 間違いが正解に直ったり、逆に一度正解したものを間違えたり、なかなかうまくいかない文字が見えてくると思います。

--- 

## 参考：100ステップ目
![スクリーンショット 2017-01-16 13.59.17.png](https://qiita-image-store.s3.amazonaws.com/0/143108/70e2b2ac-2066-b514-3e23-6e543f1f6c66.png)

---

## 参考：1000ステップ目
![スクリーンショット 2017-01-16 13.59.27.png](https://qiita-image-store.s3.amazonaws.com/0/143108/6c41774e-bde1-3234-c3d1-4f6cc6f5abd9.png)

---

## 参考：20000ステップ目

![スクリーンショット 2017-01-16 15.34.28.png](https://qiita-image-store.s3.amazonaws.com/0/143108/4d0bef94-f465-5ba1-17a2-38b8dc76e1f0.png)

---

## TensorBoardの起動

```
tensorboard --logdir ~/mnist-visualize-example_2.1.2/var --noinspect &
```

バックグラウンドで実行しておくと、GCEインスタンスのIPアドレスの6006番ポートにアクセスするとTensorBoardにアクセスできます。

---

## クロスエントロピーの推移

<img width="1008" alt="スクリーンショット 2017-01-16 19.00.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/143108/76c1c54b-e07b-479e-b0c1-16a56ac910fc.png">

誤差が小さくなっているのがわかります
「なんとなく改善している」を示すデータ

---

## 誤差評価

計算で出した確率分布と本当の答えがどのくらい間違ってるのか（裏を返せばどのくらい正しいのか）をクロスエントロピーで示している

```python
cross_entropy = tf.reduce_mean(
  tf.nn.softmax_cross_entropy_with_logits(
    inference, # 予測された値
    label))    # 正解の値
```

---

## 誤差をどうやって小さくしている？

ディープラーニングでは、この誤差が小さくなるようにモデルを訓練をしていくのが一般的です。

```
tf.train.AdamOptimizer(1e-4)
  .minimize(cross_entropy)
```

このサンプルでは、この一行ですべてやってくれます。理論を知らなくても、TensorFlowに組み込みのオプティマイザを使うことができます。

---

## ソースコードの説明

---

## もう一つのサンプル

実際に手書きをして、答えを表示するサンプルです。
<img width="910" alt="スクリーンショット 2017-01-16 19.36.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/143108/c3eda23a-5ad3-b7b3-ddb7-0adfcb2e1f49.png">

---

たぶん時間がないので、自宅で試してみてください。(下田さんのスライドで行ったセットアップが前提です)

```
# アプリをダウンロード
wget https://github.com/ornew/mnist-visual/releases/download/v1.0.2/mnist-visualize-example_1.0.2.tar.gz
tar zxf mnist-visualize-example_1.0.2.tar.gz
cd ~/mnist-visualize-example_1.0.2/

# 学習（16コアで20分くらい）
python train.py -v

# 学習が終わったらサーバを起動
sudo python server.py -p 80
```

---

このアプリでは、下のシークバーをいじると学習率を1000ステップ単位で変更できます。

最大は、先程見た99.2％の正答率を誇る20000ステップです。

しかし、実際に試してみると、20000ステップのものでも正しく回答できない数字や、苦手な崩れ方があることに気づくと思います。下に確率分布も表示されているので、どの数字と迷っているのかもわかります。

---

なぜその数字を間違えるのでしょう？

数字でない文字を入力した場合はどうなるでしょう？

人間でも判断が難しい数字をどうやったら判断できるようになるでしょう？

TensorFlowを書くのは簡単です。問題は、あなたが手を動かすかどうかです。そこからが本当のハンズオンです。

---

手を動かせば、TensorFlowはなんでもできる魔法の杖ではなく、鉛筆でしかないことに気づくと思います。

そして、TensorFlowが素晴らしく効率の良い鉛筆であることにきっと気づくでしょう。

自分で手を動かしましょう。今回のイベントがそのきっかけになってくれればと思います。