3
2

More than 3 years have passed since last update.

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

Posted at

Aidemy 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はモデル評価のためのテストデータ。

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

ニューラルネットワークモデルを構築

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

#モジュールのインポート
from keras.model import Sequential
from keras.layers import Dense,Activation
#Sequentialインスタンスの作成(モデル管理)
model=Sequential()
#入力ユニット数28*28=784、1つ目の全結合層の出力ユニット数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()を使う。

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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2