実際にニューラルネットワークを組んでみた

# もくじ
>[まずは、コード](#まずは、コード) 
[mnistデータの準備](#mnistデータの準備)
[モデル構築](#モデル構築)
[学習](#学習)
[まとめ](#まとめ)

# まずは、コード

```python
import datetime
import os

#keras関係のインポート
from keras import Sequential
from keras.callbacks import TensorBoard
from keras.datasets import mnist
from keras.layers import Flatten, Dense, Dropout, Activation
from keras.utils import np_utils


'''
mnistデータの準備
'''
# mnistデータのロード
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 配列のデータ型を変更
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')

# 配列内の値を0~1の間に最適化
x_train /= 255
x_test /= 255

# ラベルの値をone-hotに変換
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)



'''
モデル構築
'''
# 最適化関数を定義
optimizer = 'rmsprop'
# 損失関数関数を定義
loss = 'categorical_crossentropy'

# モデルを定義
model = Sequential()

# 画像を一次元配列に変換する層を定義
model.add(Flatten(input_shape=x_train.shape[1:]))

# 32次元の全結合層を定義
model.add(Dense(32))

# 16次元の全結合層を定義
model.add(Dense(16))

# ドロップアウト層を定義
model.add(Dropout(0.15))

# クラス数と同じ次元の全結合層を定義
model.add(Dense(y_train.shape[1]))

# 活性化関数として"softmax"を使用
model.add(Activation('softmax'))


# モデルを構築
model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])



'''
TensorBoardの定義
'''
# "logs"という名前のディレクトリが存在しなければ作成
if not os.path.exists('logs'):
    os.mkdir('logs')

# 結果を保存するためのフォルダを日付と時間で作成
tensorboard_dir = r'./logs/{}'.format(datetime.datetime.now().strftime('%Y%m%d-%H%M%S'))
# TensorBoardを定義
tensorboard_callback = TensorBoard(log_dir=tensorboard_dir)



'''
学習
'''
# エポック数を定義
epochs = 300
# バッチ数を定義
batch_size = 128

# 学習を開始
model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, validation_data=(x_test, y_test), shuffle=True,
          callbacks=[tensorboard_callback])

```
上から順番に説明していく。

# mnistデータの準備

```python
# 配列のデータ型を変更
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
```
・配列のデータ型を「float32」にすることで少数を格納できるようにした。


```python
# 配列内の値を0~1の間に最適化
x_train /= 255
x_test /= 255
```
・配列内の値を255で割ることで値を0～1.0の間に正規化している。
　　- 0～1にすることで比較的少ない計算量で学習できるようにしている。
　　- 様々な値が混在しているものをある程度一定の値にし、学習の効率化を図っている。


```python
# ラベルの値をone-hotに変換
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
```
・ラベルデータ（教師データ）をone-hotへ変換
　　- mnistでは画像が「0～9」まであり、それぞれラベルデータとして”0～9”の値が付けられている。
　　- one-hotとは、上記のラベルデータを”１”なら[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]というような形にしたもののことを言う。


# モデル構築

```python
# モデルを定義
model = Sequential()
```
・model=Sequential()で順伝播型のモデルであると定義。
・上記で定義されたモデルに対して「model.add()」で層を追加。


### Flatten()
```python
# 画像を一次元配列に変換する層を定義
model.add(Flatten(input_shape=x_train.shape[1:]))
```
　　- 様々な次元のものを一列の配列に変換。


### Dense()
```python
# 32次元の全結合層を定義
model.add(Dense(32))
```
　　- 全結合層の定義。
　　- すべての層からの出力を受け取り計算を行っている。


### Dropout()
```python
# ドロップアウト層を定義
model.add(Dropout(0.15))
```
　　- ここまで使われてきた層の中で使わない割合を定義。
　　- 主に過学習を防ぐために使われる。


### Activation()
```python
# 活性化関数として"softmax"を使用
model.add(Activation('softmax'))
```
　　- 活性化関数の定義。
　　- 今回は「SoftMax」を使うことで出力結果を割合に変更している。


### model.compile()
```python
# モデルを構築
model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])
```
　　- ここまで定義してきたモデルを構築。
　　- 構築する際に損失関数と最適化関数を決める。
　　- 今回は損失関数として「交差エントロピー関数」を最適化関数として「RMSProp」を使用した。


### TensorBoardの定義

```python
# "logs"という名前のディレクトリが存在しなければ作成
if not os.path.exists('logs'):
    os.mkdir('logs')

# 結果を保存するためのフォルダを日付と時間で作成
tensorboard_dir = r'./logs/{}'.format(datetime.datetime.now().strftime('%Y%m%d-%H%M%S'))
# TensorBoardを定義
tensorboard_callback = TensorBoard(log_dir=tensorboard_dir)
```

・TensorBoardとは、学習の様子や結果を見るための便利なツール。

# 学習
### epochs
```python
# エポック数を定義
epochs = 300
```
　　- 学習の回数を定義。
　　- Kerasではepochs=イテレーターではないので注意。
### batch_size
```python
# バッチ数を定義
batch_size = 128
```
　　- イテレーターの数で一気に何枚の画像を使って学習するかを定義。
　　- Kerasでは「入力された画像の枚数/batch_size」でイテレーターの数を求めている。
### model.fit()
```python
# 学習を開始
model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, validation_data=(x_test, y_test), shuffle=True,
          callbacks=[tensorboard_callback])
```
　　- これまで定義、構築してきたモデルデータに学習データとラベルデータを渡し学習を開始。
# 結果例
![tensorboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3163792/358f376a-3350-0c09-4ddd-3a1ffd5d121b.png)

こんな風になれば良き。

# まとめ
みんな！ニューラルネットワーク…組めたよね？


### ね？
### 組めたよね？(゜▽゜)

記事作成：N&Y