【Aidemy】 ディープラーニングで手書き数字を識別してみよう⑥
前回の続き。
Aidemyの画像認識コース。ちょっと進みが遅いから書くのは少なめで行く…。
ディープラーニング基礎。
深層学習の実践(手書き文字認識を例に)
深層学習とは
- ディープニューラルネットワークというモデルを使い、データの分類や回帰を行う手法
- 機械学習の1手法
分類までの流れ
- データを用意
- ニューラルネットワークモデルの構築
- モデルにデータを与え学習させる
- モデルの分類精度を評価
ディープニューラルネットワーク
- 入力層、出力層、隠れ層からなる
- 各層の縦に並んだベクトルの一つ一つの要素をノード、次元数をノード数と呼ぶ
- 出力はクラスラベルに対応する要素が1に、それ以外の値が0になる、one-hotベクトル
データの用意
- 手書き数字のデータセットであるMNIST
- 以下のようにダウンロードすることができる
from keras.datasets import mnist (X_train, y_train), (X_test, y_test) = mnist.load_data()
モデルの生成
- Kerasの
Sequential
を用いる
from keras import Sequential from keras.layers import Activation from keras.layers import Dense from keras.optimizers import sgd # インスタンス作成 model = Sequential() # ユニット数128の全結合層を追加 model.add(Dense(128)) # 活性化関数を追加 model.add(Activation('sigmoid')) # コンパイル model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])
モデルの学習
verbose=1
で学習の過程を出力できる
history = model.fit(X_train, y_train, verbose=1, epochs=10)
モデルの評価
score = model.evaluate(X_test, y_test, verbose=1)
モデルによる分類
predict
メソッドを用いて予測値を取得できる- 最後の活性化関数が
softmax
などであれば各クラスに属する確率のリストが出力される - 以下のようにすることで予測したクラスラベルがわかる
pred = np.argmax(model.predict(X_test[0]))
深層学習のチューニング
ハイパーパラメータ
- 活性化関数、隠れ層の数・チャンネル数、ドロップアウト率、学習率、最適化関数、誤差関数、バッチサイズ、エポック数
ネットワーク構造
- 隠れ層の数、隠れ層のユニット数は自由に決められる
- 隠れ層やユニット数を多くすると多彩な関数が表現できるが、入力層に近い重みを適切に更新するのが難しく学習が進みにくい
- 理論で裏付けて決めることが難しく、似たような実装例を参考にするなど経験に基づいて決定される傾向がある
ドロップアウト
- ユニットの一部が学習の0で上書きされる
- 特定のニューロンの存在に依存できなくなり、より汎用的な特徴を学習するようになる
活性化関数
- ReLU(ランプ関数)
損失関数
- 学習時にモデルの出力と教師データとの差を評価する関数
- 誤差逆伝搬法で損失関数を最小化するように重みを更新
- 二乗誤差:連続値の評価に優れ、主に回帰モデルの誤差関数として使われる
- クロスエントロピー誤差:二値分類の評価に特化しているため、主に分類モデルの誤差関数として使われる
最適化関数
- 重みの更新は誤差関数を書く重みで微分した値を元に更新すべき方向とどの程度更新するかを決める
- 微分によって求めた値を学習率、エポック数、過去の重みの更新料などを踏まえてどのように重みの更新に反映するかを定めるのが最適化関数
学習率
- 各層の重みを一度にどの程度変更するかを決めるハイパーパラメータ
バッチサイズ
反復学習
- モデルの精度を上げるために同じ訓練データを使って何度か学習させること
- 学習を行う回数をエポック数という