Windows 8.1にTheano/Kerasをインストール

# はじめに

1. Theanoとは
  * 多次元の配列を含む数式を効率的に定義、最適化、評価するためのPythonライブラリ

2. Kerasとは
 * Python / Theanoによって実装されたミニマルかつ高度にモジュラー化されたニューラルネットワークライブラリ
 * モジュール化、ミニマリズム、拡張性により、簡単かつ素早くプロトタイピングすることがきる。
 * convolutional network(CNN)とrecurrent network(RNN)および、それらの組み合わせサポートしている。
 * 任意の接続スキームをサポートしている（モデルに対する複数のインプット、複数のアウトプット等）。
 * CPUとGPUでシームレスに実行することができる。

# 参考資料
* Installation of Theano on Windows
(http://deeplearning.net/software/theano/install_windows.html)

# インストール先の環境
本手順の確認に使用したインストール先環境を以下に示す。<br>
**OS:** Windows 8.1 64bit
**GPU:** NVIDIA GeForce GTX 760

# Visual Studio Community 2013のインストール
1. 以下のURLのページからインストーラをダウンロードして実行する。
<pre>
https://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs
</pre>
  * Microsoft Visual Studio Community 2013 Update 4 - 英語(vs_community.exe)をダウンロード
  * MFC等のOptional features to installは必要ないので全てチェックを外してインストールする（必要になったら後からインストールできる）。
2. Visual Studio Community 2013は無償のソフトウェアであるがMicrosoftアカウントに紐づくライセンスは必要となる（30日で試用期間が切れる）。<br>したがって、インストール後に一度起動し、Microsoftアカウントでサインインすることにより、ライセンスのダウンロードとインストールを行う必要がある。

# CUDA 7のインストール
1. 以下のURLのページからインストーラをダウンロードして実行する。
<pre>
https://developer.nvidia.com/cuda-downloads
</pre>
  * Windows 8.1 Network Installer (cuda_7.0.28_windows_network.exe)をダウンロード
  * インストールオプションは全てデフォルトのまま変えずにインストールする。

# Git for Windowsのインストール
1. 以下のURLのページからインストーラをダウンロードして実行する。
<pre>
http://msysgit.github.io/
</pre>
  * Git-1.9.5-preview20150319.exeをダウンロード<p>
  * コマンドプロンプトから使用できるように Adjusting your PATH environment を Use Git from the Windows Command Prompt に設定してインストールする。
  * それ以外のインストールオプションは全てデフォルトのまま変えずにインストールする。

**※以下、Python 3.4系のインストール手順を示す(未確認であるが2.7系でも同様の手順になるものと思われる)。**<br>
# Anacondaのインストール
1. 以下のURLからインストーラをダウンロードして実行する。
<pre>
http://continuum.io/downloads#py34
</pre>
  * Windows 64-Bit Python 3.4 Graphical Installer (Anaconda3-2.3.0-Windows-x86_64.exe)をダウンロード
  * インストールオプションは全てデフォルトのまま変えずにインストールする。
2. パッケージを最新状態にアップデートしてから、Theanoの実行に必要なパッケージ(mingw, libpython)をインストールする。

* コマンドプロンプトで以下のコマンドを実行する。
<pre>
\>conda update conda
\>conda update anaconda
\>conda update --all
\>conda install mingw libpython
</pre>

# Theanoのインストール
1. Github上のTheanoをインストールする。
  * コマンドプロンプトで以下のコマンドを実行する。
<pre>
>pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git
Collecting git+git://github.com/Theano/Theano.git
  Cloning git://github.com/Theano/Theano.git to c:\users\USERNAME\appdata\local\temp\pip-j0qynrd6-build
Installing collected packages: Theano
  Found existing installation: Theano 0.7.0
    Uninstalling Theano-0.7.0:
      Successfully uninstalled Theano-0.7.0
  Running setup.py install for Theano
Successfully installed Theano-0.7.0
</pre>
2. 設定ファイル(.theanorc.txt)をホームフォルダに作成する。
<pre>

```%USERPROFILE%\theanorc.txt
[global]
device = gpu
floatX = float32
#optimizer_including = cudnn

[nvcc]
compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
fastmath = True
```
</pre>
3. 以下のテストプログラムを実行し、GPUの使用が有効になっていることを確認する。
<pre>

```theano_test.py
from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time

vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print(f.maker.fgraph.toposort())
t0 = time.time()
for i in range(iters):
    r = f()
t1 = time.time()
print('Looping %d times took' % iters, t1 - t0, 'seconds')
print('Result is', r)
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
    print('Used the cpu')
else:
    print('Used the gpu')
```
</pre>

* 実行結果
<pre>
\>python theano_test.py
DEBUG: nvcc STDOUT mod.cu
(以下、DEBUG出力は省略)
Using gpu device 0: GeForce GTX 760
[GpuElemwise{exp,no_inplace}(<CudaNdarrayType(float32, vector)>), HostFromGpu(Gp
uElemwise{exp,no_inplace}.0)]
Looping 1000 times took 0.472337007522583 seconds
Result is [ 1.23178029  1.61879349  1.52278066 ...,  2.20771813  2.29967761
  1.62323296]
Used the gpu
</pre>

# Kerasのインストール
1. Github上のKerasをインストールする。
  * コマンドプロンプトで以下のコマンドを実行する。
<pre>
>pip install --upgrade --no-deps git+git://github.com/fchollet/keras.git
Collecting git+git://github.com/fchollet/keras.git
  Cloning git://github.com/fchollet/keras.git to c:\users\USERNAME\appdata\local\temp\pip-kmvlykxl-build
Installing collected packages: Keras
  Found existing installation: Keras 0.1.2
    Uninstalling Keras-0.1.2:
      Successfully uninstalled Keras-0.1.2
  Running setup.py install for Keras
Successfully installed Keras-0.1.2
</pre>
2. MNIST（手書き数字のデータセット）の画像認識のサンプルプログラムを実行して動作確認する。
  * 以下のサンプルプログラムをダウンロードする。
<pre>
https://raw.githubusercontent.com/fchollet/keras/master/examples/mnist_mlp.py
</pre>
  * コマンドプロンプトで以下のコマンドを実行する。<br>
（データセットがダウンロードされ、学習(Train)と評価(Test)が行われる）
<pre>
>python mnist_mlp.py
Using gpu device 0: GeForce GTX 760
Downloading data from https://s3.amazonaws.com/img-datasets/mnist.pkl.gz
15302656/15296311 [==============================] - 7s
60000 train samples
10000 test samples
DEBUG: nvcc STDOUT mod.cu
(以下、DEBUG出力は省略)
Train on 60000 samples, validate on 10000 samples
Epoch 0
1s - loss: 0.5052 - acc: 0.8540 - val_loss: 0.2022 - val_acc: 0.9391
Epoch 1
1s - loss: 0.2114 - acc: 0.9379 - val_loss: 0.1349 - val_acc: 0.9588
Epoch 2
1s - loss: 0.1529 - acc: 0.9546 - val_loss: 0.1089 - val_acc: 0.9672
Epoch 3
1s - loss: 0.1256 - acc: 0.9628 - val_loss: 0.0907 - val_acc: 0.9712
Epoch 4
1s - loss: 0.1085 - acc: 0.9668 - val_loss: 0.0812 - val_acc: 0.9747
Epoch 5
1s - loss: 0.0945 - acc: 0.9707 - val_loss: 0.0742 - val_acc: 0.9766
Epoch 6
1s - loss: 0.0856 - acc: 0.9740 - val_loss: 0.0790 - val_acc: 0.9765
Epoch 7
1s - loss: 0.0774 - acc: 0.9763 - val_loss: 0.0756 - val_acc: 0.9769
Epoch 8
1s - loss: 0.0721 - acc: 0.9771 - val_loss: 0.0671 - val_acc: 0.9785
Epoch 9
1s - loss: 0.0666 - acc: 0.9797 - val_loss: 0.0712 - val_acc: 0.9774
Epoch 10
1s - loss: 0.0623 - acc: 0.9805 - val_loss: 0.0670 - val_acc: 0.9770
Epoch 11
1s - loss: 0.0587 - acc: 0.9818 - val_loss: 0.0727 - val_acc: 0.9779
Epoch 12
1s - loss: 0.0554 - acc: 0.9823 - val_loss: 0.0643 - val_acc: 0.9804
Epoch 13
1s - loss: 0.0512 - acc: 0.9832 - val_loss: 0.0709 - val_acc: 0.9787
Epoch 14
1s - loss: 0.0495 - acc: 0.9847 - val_loss: 0.0638 - val_acc: 0.9803
Epoch 15
1s - loss: 0.0465 - acc: 0.9845 - val_loss: 0.0664 - val_acc: 0.9809
Epoch 16
1s - loss: 0.0443 - acc: 0.9860 - val_loss: 0.0599 - val_acc: 0.9831
Epoch 17
1s - loss: 0.0438 - acc: 0.9857 - val_loss: 0.0652 - val_acc: 0.9813
Epoch 18
1s - loss: 0.0419 - acc: 0.9865 - val_loss: 0.0673 - val_acc: 0.9813
Epoch 19
1s - loss: 0.0387 - acc: 0.9877 - val_loss: 0.0682 - val_acc: 0.9805
Test score: 0.0682498943741
Test accuracy: 0.9805
<pre>