LoginSignup
0
0

More than 3 years have passed since last update.

深層学習 画像認識2 モデルの実装

Posted at

Aidemy 2020/11/10

はじめに

 こんにちは、んがょぺです!バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます!
 今回は、深層学習・画像認識の二つ目の投稿になります。どうぞよろしくお願いします。

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

今回学ぶこと
・畳み込みニューラルネットワークについて
・モデルの実装について

(復習)畳み込みニューラルネットワーク

概要

畳み込みニューラルネットワーク(CNN)とは、画像処理で主に使われる深層学習の手法である。
・Chapter1で使用していた多層パーセプトロン(MLP)は一次元の入力で他を受け取っていたが、CNNは二次元のままデータを受け取れるので、画像のような二次元データを、情報を失わずに学習を行うことができる。

・畳み込みニューラルネットワークは「畳み込み層」「プーリング層」からなる。畳み込み層は入力データの一部分に注目してその画像の特徴を調べる層のことである。
プーリング層は畳み込み層からの出力データを縮約し、データ量を削減する層である。縮約の方法としては、各特徴の最大値をとる「Maxプーリング」、平均値を取る「Averageプーリング」がある。

・畳み込み層の関係図スクリーンショット 2020-11-09 12.26.54.png

・プーリング層の関係図(Maxプーリング)スクリーンショット 2020-11-09 12.27.33.png

層の実装

・今回はSequentialモデルで層の実装を行う。
・層の種類の一つには「全結合層(Dense)」がある。これは、入力と出力が全てつながっているような層である。以下のモデルでは、全結合層を2回使っている。

スクリーンショット 2020-11-09 12.37.25.png

・前項の「畳み込み層」は「Conv2D()」で実装できる。「filters」にはフィルタの数、「kernel_size」にはフィルタのサイズ、「strides」はフィルタを一度に動かす距離、「padding」'same'なら入力サイズと出力サイズを揃え、'valid'なら行わない。

・プーリング層は、Maxプーリングなら「MaxPooling2D()」で実装できる。「pool_size」はプールする範囲の大きさ、「strides」はフィルタを一度に動かす距離を指定する(stridesは指定しなくても良い)。

・これらの入力層については、「input_dim(一次元)」「input_shape(多次元)」で入力データの大きさを指定する。例えば、(28×28)のRGB画像データの場合「input_shape=(28,28,3)」となる。

・Conv2DやMaxPooling2Dなどの2次元の出力をする層と、Denseのように__1次元の入力を受け取る層を結合するときは「平坦化層」を追加する必要がある。
・平坦化層は
「Flatten()」で追加でき、特に引数は必要ない_。

・以下のコードはここまでの層を追加したものの例である。
model.add(Conv2D(input_shape=(28, 28, 3), filters=32, kernel_size=(2, 2), strides=(1, 1), padding="same"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(filters=32, kernel_size=(2, 2), strides=(1, 1), padding="same"))
model.add(MaxPooling2D(pool_size=(2, 2)))

モデルの学習

活性化関数の指定

「model_add(Activation('関数名'))」で活性化関数を指定する。シグモイド関数なら「sigmoid」、ReLU関数なら「relu」、出力層で使われる「softmax」がある。

コンパイル、学習

・モデルに層を追加したら、コンパイルを行う。コンパイルでは、学習率の変更方法や、損失関数の指定精度指標の指定などを行う。より正確にはコンパイルとは、「高水準のプログラミング言語で書かれたコードを解析し、コンピュータが直接実行可能な機械語にあらかじめ変換すること」である。
・コンパイルは「model.compile()」で行える。「optimizer」で学習率を指定、「loss」で損失関数を指定、「metrics」は精度指標を指定する。
・学習率は[SGD,RMSprop,Adagrad,Adadelta,Adam]などがあるがどれを使うかは探索的に決定する。
・損失関数は平均二乗誤差(mean_squared_error)交差エントロピー(category_crossentropy,binary_crossentropy)などがある。
metrics「['accuracy']」と指定することが多い。

・学習は「model.fit()」で行う。これにトレーニングデータの入力とラベルを渡す他、「batch_size」で一度に渡すデータ数の指定、「epochs」で学習回数を指定する。batch_sizeについては、Chapter1の最後に学んだ「ミニバッチ学習」を行うために指定する。

・コード例
スクリーンショット 2020-11-09 13.55.24.png

モデルの性能評価

・学習させたモデルに対して、テストデータで精度評価する。これは「model.evaluate()」で行う。テストデータの入力データとラベルを渡す他、verbose=1とすると計算過程を表示する。

モデルのセーブ、ロード

・作成したモデル保存するときは「model.save('model.h5')」のように行う。
・このモデルを読み込むときは「model.load_model('model.h5')」とする。

・また、人がこのモデルを閲覧したり編集したりするようにするには、一度「json」形式に変換する必要がある。これは「model.to_json()」で行う。
・これをロードするには「model_from_json(変換後のモデル)」とする。

まとめ

・画像処理では、二次元の画像データが扱える「畳み込みニューラルネットワーク」が使われる。
・モデルの実装としては、畳み込み層と全結合層を平坦化層で結合することで実装し、コンパイルと学習行ったら、モデルを評価するという手法を使う。

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

0
0
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
0
0