ニューラルネットワークは電気ねずみの夢を見るか？

この記事は[Tech-Circle Hands on Advent Calendar 2016](http://qiita.com/advent-calendar/2016/techcircle "Tech-Circle Hands on Advent Calendar 2016")の23日目の記事です。
投稿遅れてしまいました。

22日の記事は[@morio36](http://qiita.com/morio36 "morio36
")さんによる[Wikitudeを使用して特定の場所に近づいたタイミングでTheta自動撮影](http://qiita.com/morio36/items/3a461e2f26f82e23d059 "Wikitudeを使用して特定の場所に近づいたタイミングでTheta自動撮影")でした。
Thetaを使ってARという非常に興味深い記事です！

#はじめに
みなさんポケモンは好きですか？
最近も新しいタイトルが発売されたポケモンですが、なんと現在は801種類も登場しているそうです。

数が多くなれば似ているポケモンも出てくるというもの。
その中で正しくポケモンを判別するのは難しいのではないでしょうか。
![1482519198rtKJeZJsIj6v83T1482518933.gif](https://qiita-image-store.s3.amazonaws.com/0/143285/5bd0dea4-72fd-476d-10e9-fc966a5bcc90.gif "1482519198rtKJeZJsIj6v83T1482518933.gif")
以下より引用
http://www.pokemon.co.jp/ex/sun_moon/
http://www.pokemon.jp/



そこで、昨今賑わっているディープラーニングを用いて
ポケモン判別を行ってみようというのが本記事です。

#概要
ディープラーニングを初めて実装して動かしてみたというのが本記事の趣旨です。
手法の詳しい説明はありませんが、実際に動かして分かった点・躓いた点を通して
興味を持ってもらえればと思います。

#目標
「ピカチュウ」と「デデンネ」の画像を学習させ、
テストで2匹を正しく判別できるようにすることが目標です。

#環境
以下環境を用いました。
・Mac(OS X El Capitan 10.11.6)
・Python 3.5.0

#準備
ディープラーニングのライブラリとしてGoogleが公開しているtensorflowを、
画像認識ライブラリとしてOpenCV使えるようにします。

##Anacondaインストール
Pythonのパッケージ管理システムであるAnacondaをインストールします。
Pythonパッケージ管理システムはpipなどがありますが、OpenCVを利用することに関連してAnaconda推奨です。
(私はここの選択を誤って数時間失ってしまいました。)
理由は後述します。

インストールの方法としては[こちら](http://qiita.com/oct_itmt/items/2d066801a7464a676994)を参考にしました。
Python3系のAnacondaをインストールします。

Homebrewやpyenvなどもインストールする必要がありますが、問題なく進めることができました。

また、Pythonまわりについての紹介、解説としては[こちら](http://qiita.com/icoxfog417/items/e8f97a6acad07903b5b0)の記事がおすすめなので是非見てみてください！

##tensorflowインストール
ディープラーニングを実装するにあたりスクラッチで開発もできますが、
ライブラリであるtensorflowを利用します。
参考にしたのは[こちら](http://pythondatascience.plavox.info/tensorflow%E3%81%A7%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0/ubuntu-linux%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)です。

この中で少し躓いたのは環境のアクティベートについてです。
私の環境では記事通りではアクティベートできなかったので以下を実行しました。

```
source ~/.pyenv/versions/Annacondaのバージョン/bin/activate 仮想環境名
```

また、該当記事はlinux向けの説明ですのでtensorflowのインストールの際、バージョンをMac向けのものに読み替える必要があります。

pythonの対話モードでtensorflowがインポートできればOK。

```
$ python
Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul  2 2016, 17:52:12) 
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> 
```

##OpenCVのインストール
ここが一番詰まりました。
Python3系の場合OpenCV3をインストールする必要があります。
(Python2系の場合はOpenCV2)

Homebrewでも以下コマンドでOpenCV3をインストールできますが、
私はどうやっても解決することができませんでした。
(ネットで調べる限りではできてる人はいるようですが)

```上手くいかなかった
 brew install opencv3 --with-python3
```

そこでAnacondaの登場です。
Anacondaのライブラリとして既にOpenCV3が用意されているため、
以下コマンドでインストールすればさくっと解決できます！

```
conda install -c https://conda.anaconda.org/menpo opencv3
```

インストール後確認したところ上手く入っているようです。
(OpenCV2もOpenCV3もcv2としてインポートします)

```
$ python
Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul  2 2016, 17:52:12) 
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.1.0'
>>> 

```

これで環境準備完了です！

#実装
ディープラーニングの中でも画像といえばConvolutional Neural Network(以下CNN)という手法がオーソドックスなので、今回もCNNで判定を行おうと思います。
また、教師画像の大きさを統一するためにOpenCVを利用します。

今回は都合上、[TensorFlowでアニメゆるゆりの制作会社を識別する](http://kivantium.hateblo.jp/entry/2015/11/18/233834)のコードをほぼ利用させて頂き、実装しました。

本来はどのように実装するかが醍醐味なのですが、動かすことを第一目標に進めました。
CNNのキモであるフィルタの設定やレイヤ構成をどのようにするかなどで精度が変わって来ますが、
今後勉強を勧めていく中で実装と見比べることで理解が深めていければと思います。


##修正点
python2系向けの記述である点と実行時のパスなどに関連する部分を修正しました。

・156行目、175行目
　　教師データ、テストデータが同階層に配置された画像を対象としていたため任意の箇所に修正
・214行目
　　バッチサイズごとに実行する訓練を判定する際、rangeに与えられる型がfloatになってしまいエラーになるのでint型にキャスト
・228行目、238行目
　　python3ではprint関数となったためカッコを付与

##教師画像・テスト画像
教師画像データは上記修正点で指定したディレクトリに配置します。
google画像検索で取得した画像を2匹（ピカチュウ・デデンネ）合わせて100枚を配置しました。
キーワード検索した結果で無関係である画像は除外していますが、これがなかなか大変でした。

テスト画像は教師画像とは別にやはり2匹合わせて100枚を用意しました。

【今回できなかったこと】
・圧倒的に教師データ数が足りていません。データ数を増やすための水増し手法として画像加工（反転、明度調整など）する方法がありますが今回は行っていません。
・画像リサイズは実装内で行っていますが、正規化など事前処理を行うのがセオリーとされていますが実施していません。
　　　　　　
##教師データ・テストデータ
train.txt、test.txtとして実行ファイル同階層に配置しています。フォーマットは以下です。

```
ファイル名 ラベル名
```

#実行
それでは実行してみましょう！

```
$ python pika_pre.py
step 0, training accuracy 0.590909
step 1, training accuracy 0.409091
step 2, training accuracy 0.654545
step 3, training accuracy 0.7
step 4, training accuracy 0.745455
step 5, training accuracy 0.772727
step 6, training accuracy 0.827273
step 7, training accuracy 0.890909
step 8, training accuracy 0.918182
step 9, training accuracy 0.845455
step 10, training accuracy 0.881818
step 11, training accuracy 0.954545
step 12, training accuracy 0.954545
step 13, training accuracy 0.954545
step 14, training accuracy 0.972727
step 15, training accuracy 0.972727
step 16, training accuracy 0.972727
step 17, training accuracy 0.963636
step 18, training accuracy 0.963636
step 19, training accuracy 0.972727
step 20, training accuracy 0.972727
step 21, training accuracy 0.981818
step 22, training accuracy 0.990909
step 23, training accuracy 1
step 24, training accuracy 1

省略

test accuracy 0.838095
```

トレーニング中の正答率が training accuracyとして出力されます。
step 0では59%ですが、
step 23以降は100％になっていました。

また、学習完了後にテストデータの判定を行った結果は正答率83%でした。


これはちょっと怪しい気がします。
教師データの量、質を考えるとこんなに短時間で高精度にならないと予想していたのですが。

tensorflowではtensorboardという機能を使うことによって、学習過程やデータフローを簡単に可視化することができるのでそちらでも確認してみます。
以下コマンドを実行し、その後表示されるURLをブラウザで開いてみます。

```
tensorboard --logdir /tmp/data
Starting TensorBoard b'29' on port 6006
(You can navigate to http://192.168.11.7:6006)
```
![スクリーンショット 2016-12-23 23.21.10.png](https://qiita-image-store.s3.amazonaws.com/0/143285/a0c849b4-8c5b-c8f3-fd90-5f8305ddb760.png "スクリーンショット 2016-12-23 23.21.10.png")


うーんこんなに精度よくなるもんなのでしょうか。
ちゃんと意図したとおり動いているか、検討が必要そうです。

#まとめ
今回初めて動かしてみたというところで以下を学ぶことができました。
・環境準備（Anaconda,tensorflow,OpenCV）
・教師データの用意の困難さ
・tensorboardの利用方法

次に挑戦してみたいところとしては以下です。
・0からの実装
・tensorflowの理解
・CNNの理解、実験
・教師データの事前処理



「君は今！ディープラーニング実装への第一歩を踏み出した！」
というところですのでこれからも機械学習の勉強を続けようと思います。

#参考
http://qiita.com/icoxfog417/items/02a80b93b5f1e95f2795
http://qiita.com/icoxfog417/items/5fd55fad152231d706c2
http://qiita.com/bohemian916/items/9630661cd5292240f8c7
http://qiita.com/icoxfog417/items/65e800c3a2094457c3a0
http://qiita.com/shim0mura/items/b0ec437206ed3d19d878
http://qiita.com/icoxfog417/items/fb5c24e35a849f8e2c5d

***

明日、というか24日目は@shiracoによる「対話システムを支える自然言語処理技術」です！お楽しみに！