[Keras/TensorFlow] Keras(Tensorflow)の環境構築

# 目的
ゼロからKerasとTensorFlow(TF)を自由自在に動かせるようになる。
そのための、End to Endの作業ログ(備忘録)を残す。
※環境はMacだが、他のOSでの汎用性を保つように意識。
※アジャイルで執筆しており、精度を逐次高めていく予定。


# 環境
- Mac: 10.12.3
- Python: 3.6
- TensorFlow: 1.0.1
- Keras: 2.0.2


# To Do
### Keras導入編
[Keras(Tensorflow)の環境構築](http://qiita.com/agumon/items/4d7826c2c39d0af868bd)<---いまココ
[KerasでMINSTの学習と予測](http://qiita.com/agumon/items/4c6ff24bfd77a5c8101d)
[KerasでTensorBoardの利用](http://qiita.com/agumon/items/114da6921c5dc4f7d7f9) 
[Kerasで重みファイルの保存/読み込み](http://qiita.com/agumon/items/91f897b7f260f6aeca95)
[Kerasで自前データの学習と予測](http://qiita.com/agumon/items/ab2de98a3783e0a93e66) 
[Kerasで転移学習](http://qiita.com/f2um2326/items/60f7bcc8ae26b5004a3a#_reference-5d15f52415912c9c2182)

# 流れ
Anacondaの仮想環境の中にTFとKerasをインストールし、サンプルコールを実行する。
Anacondaのインストールはpyenvを利用、Anacondaの公式サイトから直接インストールしても良い。


# pyenvのインストール

```
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

環境変数の設定　※ターミナルを再起動すると設定が有効になる。

```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```


# Anacondaのインストール
Anacondaのバージョン確認

```
pyenv install --list | grep anaconda3
```

以下が表示される。多くのバージョンが表示されるが、今回は末尾の部分のみ掲載した。

```
  anaconda3-4.2.0
  anaconda3-4.3.0
  anaconda3-4.3.1
```

最新版をインストール

```
// this will take time
pyenv install anaconda3-4.3.1
```
```
pyenv versions
pyenv global anaconda3-4.3.1
```

Anacondaの環境変数を設定　※ターミナルを再起動すると設定が有効になる。

```
echo 'PATH="$PYENV_ROOT/versions/anaconda3-4.3.1/bin:$PATH"' >> ~/.bash_profile
```

# Python 3.6の仮想環境の作成

`py36`という名前のPython3.6の仮想環境を作成する。
仮想環境のメリットは、例えばPython2系を使いたい場合に別の仮想環境を作れば、作業環境の切り分けが簡単になる。

```
// this will take time
conda create -n py36 python=3.6 anaconda
```

仮想環境を起動

```
source activate py36
```

作られた仮想環境の確認

```
conda info --envs
```

一覧が表示される。*は現在いる仮想環境

```
# conda environments:
#
py36                  *  /Users/XXX/anaconda/envs/py36
root                     /Users/XXX/anaconda
```

ちなみに、仮想環境を閉じたいときのコマンド

```
source deactivate py36
```


# TFのインストール
```
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.0.1-py3-none-any.whl
```

pythonを立ち上げ稼働確認

```
python
```

以下を実行

```py3
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
```

`Hello, TensorFlow!`が表示されたらセットアップ成功である。

python終了

```
quit()
```


# Kerasのインストール
```
pip install keras==2.0.2
```

# サンプルコードで挙動確認
Kerasのサンプルスクリプトのインストール

```
git clone https://github.com/fchollet/keras.git
```

グラフの表示に必要なライブラリのインストール
brewのインストールは公式サイトを参考：https://brew.sh/index_ja.html

```
// this will take time
brew install graphviz
pip install pydot
pip install pydot-ng
pip install graphviz
```

今回はMINSTを学習するサンプルを見てみる。Spyderというのはpythonの開発環境でAnacondaをインストールした時に付随する。

```
spyder keras/examples/mnist_mlp.py
```

実行時間短縮のために`epochs = 3`にした。
また、後半にグラフ表示のためのスクリプトを追加した。

```py:mnist_mlp.py
from __future__ import print_function

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop


batch_size = 128
num_classes = 10
epochs = 3

# the data, shuffled and split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))

model.summary()

model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])


### add to show graph
import matplotlib.pyplot as plt
def plot_history(history):
    # print(history.history.keys())

    # 精度の履歴をプロット
    plt.plot(history.history['acc'], marker='.')
    plt.plot(history.history['val_acc'], marker='.')
    plt.title('model accuracy')
    plt.xlabel('epoch')
    plt.ylabel('accuracy')
    plt.grid()
    plt.legend(['acc', 'val_acc'], loc='lower right')
    plt.show()

    # 損失の履歴をプロット
    plt.plot(history.history['loss'], marker='.')
    plt.plot(history.history['val_loss'], marker='.')
    plt.title('model loss')
    plt.xlabel('epoch')
    plt.ylabel('loss')
    plt.grid()
    plt.legend(['loss', 'val_loss'], loc='lower right')
    plt.show()
    
plot_history(history)
```


Spyderの画面にある実行ボタン▶あまたはF5を押す、出力が表示される。

```
60000 train samples
10000 test samples
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_10 (Dense)             (None, 512)               401920    
_________________________________________________________________
dropout_7 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_11 (Dense)             (None, 512)               262656    
_________________________________________________________________
dropout_8 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_12 (Dense)             (None, 10)                5130      
=================================================================
Total params: 669,706.0
Trainable params: 669,706.0
Non-trainable params: 0.0
_________________________________________________________________
Train on 60000 samples, validate on 10000 samples
Epoch 1/3
60000/60000 [==============================] - 14s - loss: 0.2457 - acc: 0.9240 - val_loss: 0.1238 - val_acc: 0.9598
Epoch 2/3
60000/60000 [==============================] - 15s - loss: 0.1038 - acc: 0.9685 - val_loss: 0.0879 - val_acc: 0.9735
Epoch 3/3
60000/60000 [==============================] - 16s - loss: 0.0752 - acc: 0.9766 - val_loss: 0.0813 - val_acc: 0.9759
Test loss: 0.081280838731
Test accuracy: 0.9759
```

accとlossのグラフも表示される。
![keras_minst_acc.png](https://qiita-image-store.s3.amazonaws.com/0/175092/43d7c54e-5064-f048-c124-28f8d9a0d015.png)
![keras_minst_loss.png](https://qiita-image-store.s3.amazonaws.com/0/175092/dd960453-892c-d444-68b0-6fe75f512552.png)



以上で環境構築は完了です。


# End