ディープラーニング1　深層学習の実践

[Aidemy](https://aidemy.net/)　2020/9/30
#はじめに
　こんにちは、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、ディープラーニングの一つ目の投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・深層学習（ディープラーニング）について
・手書き数字を分類するモデルをつくる

#深層学習（ディープラーニング）について
##深層学習（ディープラーニング）とは
・深層学習（ディープラーニング）とは、機械学習の一種で、__ディープニューラルネットワーク__と言うモデルを使ってデータの分類や回帰を行うことを指す。生物の神経（ニューロン）ネットワークを参考に作られているので、このような名前で呼ばれる。
・深層学習は画像認識や音声認識の分野で広く使われている。深層学習の目的は「画像や音声の認識精度を高めること」である。

・（ディープ）ニューラルネットワークは、__ニューロン__という情報の受け取りと出力を行う要素が階層になって構成される。このときの階層が3層以上のものがディープニューラルネットワークというモデルとして扱われる。また、このとき入力する層を__入力層__、出力する層を__出力層__、その二つの間の層のことを__隠れ層__という。層ごとの、前のニューロンと次のニューロンとが結合している層のことを__全結合層__という。

・ニューロンは入力された__入力値（x）__と__重みパラメータ（w）__と呼ばれる値を受け取る。xとwで表される式の値が、各ニューロンの持つ__閾値（θ）__より高ければ次のニューロンに1という値を渡し、それ以外なら0を渡すという仕組みになっている。この情報伝達のことを__ニューロンの発火__という。
・深層学習では、重みパラメータ（w）の値を機械的に調整することで分類モデルや回帰モデルを作る。

##深層学習の流れ
・ネットワークモデルを作る→モデルにトレーニングデータを与えて学習させる→（学習完了）→実装

・まずは前項で確認したように、いくつかのニューロンを階層構造にすることでネットワークモデルを構築する。次に、作成したモデルにトレーニングデータ（入力値x）を与えて出力値yを出力させる。このyは最初は検討違いの値が出力されるが、正解データ（教師ラベル）とのズレ_ΔE_が小さくなるように重みパラメータ（w）の値が調整され、最終的に適切な値を返すモデルが完成する。

#手書き数字を分類するモデルをつくる
##分類（モデル実装）の流れ
・データの準備→ニューラルネットワークモデルを構築→データを与え学習させる→モデルの精度評価

##ディープニューラルネットワークについての補足
・今回は、入力された手書きデータが「7」だった場合に、教師データの正解ラベルのうち、「7」に対応する値が1（on）となり、それ以外が0(off)となる。このような正解が一つでそれ以外の出力が0であるデータのことを__one-hotベクトル__という。また、「7」のようなデータを分類するときの割り当て（ラベル）のことを__クラスラベル__という。

・入力されるデータは手書き文字画像の場合、28*28の数字の集まりで構成される（ベクトル）。また、このベクトルを受けとって計算する要素を__ノード（ユニット）__といい、縦のユニット群を__層（レイヤー）__という。

##TensorFlowとKeras
・TensorFlowとは、Google社が提供する機械学習用のライブラリである。
・KerasはTensorFlowのコードを直感的で簡潔なコードにすることができるというものである。Kerasのように、他のライブラリ（この場合TensorFlow）を使いやすくしてくれるものをラッパーライブラリという。

##データの準備
・手書き数字のデータはKerasのMNISTというデータセットをインポートすれば即座に使える。
・（復習）Xは画像データ、yは教師ラベルデータ。trainは学習用データ、testはモデル評価のためのテストデータ。

```python
from keras.datasets import mnist
(X_train,y_train),(X_test,y_test)=mnist.load_data()
```

##ニューラルネットワークモデルを構築
・モデルの構築（作成）の方法は、まずモデルを管理する__Sequential()__インスタンスを作成し、それに対して
__add(Dense(１つ目の全結合層の出力ユニット数,input_dim=入力ユニット数))__
を使うことで入力層と１つ目の全結合層が作成される。また、全結合層の出力には__活性化関数__を指定する必要がある。方法は__add(Activation("関数名"))__で行う。
二つ目以降の入力層を作りたければ、その都度add()メソッドでDenseの値を指定すれば良い（input_dimの指定は1回だけでOK）。
最後に__compile()__メソッドで学習処理を設定して完了。
＊compile（）メソッドの引数にはハイパーパラメータを設定する。詳しくは次の記事で学ぶ。

```python
#モジュールのインポート
from keras.model import Sequential
from keras.layers import Dense,Activation
#Sequentialインスタンスの作成（モデル管理）
model=Sequential()
#入力ユニット数28*28=784、１つ目の全結合層の出力ユニット数256、活性化関数sigmoid
model.add(Dense(256,input_dim=784))
model.add(Activation("sigmoid"))
#2つ目の全結合層の出力ユニット数256、活性化関数relu
model.add(Dense(128))
model.add(Activation("relu"))
#3つ目の全結合層の出力ユニット数10、活性化関数softmax
model.add(Dense(10))
model.add(Activation("softmax"))
#学習処理の設定（引数は今は分からなくてOK）
model.compile(optimizer="sgd",loss="categorical_crossentropy",metrics=["accuracy"])
```

##モデルの学習
・__model.fit(X_train,y_train,verbose=0or1,epochs=学習回数)__で学習。
・epochsは1なら学習の進捗度合いを出力し、0なら出力しない。
・（復習）学習は出力と教師データの差が小さくなるように重みを変えることで行われる。

##モデルの評価
・モデルがトレーニングデータ以外にも高い精度を出せるかを、テストデータを使うことで評価する。
このときのテストデータに対する精度のことを__汎化精度__という。
・汎化精度の計算は__model.evaluate(X_test,y_test,verbose=0or1)__で行う。

##学習（＋評価）したモデルを使う
・学習（＋評価）したモデルを使って分類問題を行う。
・__model.predict(self,入力データ,batch_size=整数,verbose=0or1,steps=ステップ数)__
・各引数について

戻り値について、predict（）メソッドは予測値を格納したNumPy配列を返すが、手書き文字のクラスは10次元なので、一番大きい値を抽出する。方法は最大値のインデックス番号を取得する__np.argmax(predict()を使ったデータ,axis=1)__を使う。axis=1とすることで行ごとのインデックスが取得できるため、予測結果のみが表示される。

#まとめ
・深層学習（ディープラーニング）とは、__ディープニューラルネットワーク__と言うモデルを使ってデータの分類や回帰を行うことを指す。
・深層学習では、重みパラメータ（w）の値を機械的に調整することで分類モデルや回帰モデルを作る。
・深層学習の流れは、データの準備、モデルの作成、モデルの学習、モデルの評価、モデルによる分類である。
・手書き数字のデータはKerasのMNISTというデータセットをインポートすれば即座に使える。
・モデルの作成、モデルの学習、モデルの評価は、それぞれ__add(),fit(),evaluate()__で行う。
・モデルによる分類は__predict()__で行うが、実際に出力させる時は__np.argmax()__を使う。

今回は以上です。最後まで読んでいただき、ありがとうございました。