Dense:Conv2D(CNN)- Kerasの使い方解説
model.add(Dense(128, activation='relu'))
#コード解説
:全結合層。出力128。.addメソッドで層を追加しています。
活性化関数「ReLU(Rectified Linear Unit)- ランプ関数」。入力が0以下の時は出力0。入力が0より大きい場合はそのまま出力する。
Conv2D – Dense等を使った機械学習プログラムの記述例(一例です)
0~9の手書き文字MNISTのデータセット(訓練用画像データ6万枚・テスト用画像データ1万枚。縦28×横28ピクセル・グレースケールの白黒画像)の画像認識AIの例
model = Sequential()
model.add(Conv2D(16, (3, 3), padding='same',
input_shape=(28, 28, 1), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(Conv2D(256, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(10, activation='softmax'))
「Conv2D」を使ってディープラーニング技術でおなじみの「畳み込みニューラルネットワーク」(CNN:Convolutional Neural Network)を実装しています。
model = Sequential()
#コード解説
:Sequential – モデル層を積み重ねる形式の記述方法。.addメソッドで簡単に層を追加できます。
model.add(Conv2D(16, (3, 3), padding=’same’,
input_shape=(28, 28, 1), activation=’relu’))
#コード解説
:Conv2D – 2次元畳み込み層。空間フィルタ – 畳み込み演算層。
Conv2D(16, (3, 3)の解説
:「3×3」の大きさのフィルタを16枚使うという意味です(16種類の「3×3」のフィルタ)。「5×5」「7×7」などと、中心を決められる奇数が使いやすいようです。
フィルタ数は、「16・32・64・128・256・512枚」などが使われる傾向にあるようですが、複雑そうな問題ならフィルタ数を多めに、簡単そうな問題ならフィルタ数を少なめで試してみるようです。
padding=’same’の解説
:今回は出力画像のサイズが変わらないように「padding=’same’」でパディングを実施。フィルタを適用前に0などの要素で周囲を増やすようです。(ゼロパディング)
その他にも「stride=(1,1)」(横に1ピクセル・縦に1ピクセルずつフィルタを適用)などとストライドの追加も可能。strideを指定しない場合(デフォルト)は縦・横1ピクセルずつフィルタが適用されるようです。
input_shape=(28, 28, 1)の解説
:縦28・横28ピクセルのグレースケール(白黒画像)を入力しています。
activation=’relu’の解説
:活性化関数「ReLU(Rectified Linear Unit)- ランプ関数」。フィルタ後の画像に実施。入力が0以下の時は出力0。入力が0より大きい場合はそのまま出力する。
model.add(MaxPooling2D(pool_size=(2, 2)))
#コード解説
:「2×2」の大きさの最大プーリング層。入力画像内の「2×2」の領域で最大の数値を出力する。
model.add(Conv2D(128, (3, 3), activation=’relu’))
#コード解説
:空間フィルタ – 畳み込み演算層。「3×3」の大きさのフィルタを128枚使う(128種類の「3×3」のフィルタ)。
活性化関数「ReLU(Rectified Linear Unit)- ランプ関数」。フィルタ後の画像に実施。入力が0以下の時は出力0。入力が0より大きい場合はそのまま出力する。
model.add(Conv2D(256, (3, 3), activation=’relu’))
#コード解説
:空間フィルタ – 畳み込み演算層。「3×3」の大きさのフィルタを256枚使う(256種類の「3×3」のフィルタ)。
活性化関数「ReLU(Rectified Linear Unit)- ランプ関数」。フィルタ後の画像に実施。入力が0以下の時は出力0。入力が0より大きい場合はそのまま出力する。
model.add(MaxPooling2D(pool_size=(2, 2)))
#コード解説:
:「2×2」の大きさの最大プーリング層。入力画像内の「2×2」の領域で最大の数値を出力する。
model.add(Dropout(0.5))
#コード解説
:ドロップアウト – 過学習予防。今回は、全結合の層とのつながりを「50%」無効化しています。
model.add(Flatten())
#コード解説
:平坦化(次元削減) – 1次元ベクトルに変換する。
model.add(Dense(128, activation=’relu’))
#コード解説
:全結合層。出力128。
活性化関数「ReLU(Rectified Linear Unit)- ランプ関数」。入力が0以下の時は出力0。入力が0より大きい場合はそのまま出力する。
model.add(Dropout(0.25))
#コード解説
:ドロップアウト – 過学習予防。全結合の層とのつながりを「25%」無効化しています。
model.add(Dense(10, activation=’softmax’))
#コード解説
:全結合層。出力10(0~9の10クラス判定のため)
Denseのところで、畳み込みニューラルネットワーク(CNN)の最終的な全結合層の出力次元数の決め方は、判定するクラス数を指定します。上記のコードの場合「0〜9」までの数字を判定するため、全部で「0・1・2・3・4・5・6・7・8・9」の「10」クラスになります。そのため、最終的な全結合層の出力次元数を「10」にします。
Softmax関数で総和が1となるように、各出力の予測確率を計算。例「0.1,0,0,0,0,0,0.8,0,0,0.1」(0の確率10%。6の確率80%。9の確率10%)
Google Colaboratoryで、すぐに使える「Dense:Conv2D(CNN)」を使ったサンプルコード(Keras・CNN・MNIST・自作AI用)
・【コード解説】畳み込みニューラルネットワーク(CNN)サンプルコード – Colaboratory・Keras・MNIST
クラウド上で無料で使えるJupyterノートブック環境「 Google Colaboratory 」でKerasを使ってMNISTの数字画像認識用に、ディープラーニング(深層学習)でおなじみの「畳み込みニューラルネットワーク」(CNN:Convolutional Neural Network)のプログラミングをしてみました。機械学習モデルの畳み込みニューラルネットワークを実装する際に「Conv2D – 2次元畳み込み層」で「Dense」を使っています。
コード解説もしておきましたので、日々の学習にお役立てください。(オフラインでも学習しやすいように記事の内容を、PDFで公開してあります)
【オリジナルデータセットで機械学習に挑戦】
機械学習・人工知能プログラミングのオリジナルデータセットの壁を感じている方も多いのではないかと思います。
自作・自前画像で画像認識するためのサンプルコードを公開しました。日々の学習の参考になることがありましたら幸いです。
:【サンプルコード】Python・KerasでCNN機械学習。自作・自前画像のオリジナルデータセットで画像認識入門
:【コード解説】自作画像認識AI:Keras・CNN・Pythonオリジナルデータセット対応の機械学習サンプルコード
また、上記のサンプルコードを理解するために必要な画像認識関連の深層学習プログラミングの知識を学ぶ上で補助教材となりそうな書籍をレビューしておきました。日々の学習の一助になることがありましたら幸いです。
:【1周目 – 学習レビュー】Pythonで動かして学ぶ!あたらしい深層学習の教科書 機械学習の基本から深層学習まで(Aidemy公式教科書)