activation(Conv2D・CNN)- Kerasの使い方解説
model.add(Conv2D(16, (3, 3), padding='same',
input_shape=(28, 28, 1), activation='relu'))
#コード解説
:Conv2D – 2次元畳み込み層。空間フィルタ – 畳み込み演算層。
Conv2D(2次元畳み込み層)で、画像から特徴を抽出します。上記のConv2D(16, (3, 3)のコードでは、カーネルという入力データにかける「3×3」の16種類のフィルタを各マスにかけていき、16(枚)の出力データを得られるように指定しています。
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より大きい場合はそのまま出力する。
Conv2Dを使った機械学習プログラムの記述例(一例です)
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 | すぐに使える「activation」を使ったサンプルコード(Keras・CNN・MNIST・自作AI用)
・【コード解説】畳み込みニューラルネットワーク(CNN)サンプルコード – Colaboratory・Keras・MNIST
クラウド上で無料で使えるJupyterノートブック環境「 Google Colaboratory 」でKerasを使ってMNISTの数字画像認識用に、ディープラーニング(深層学習)でおなじみの「畳み込みニューラルネットワーク」(CNN:Convolutional Neural Network)のプログラミングをしてみました。機械学習モデルの畳み込みニューラルネットワークを実装する際に「activation=’relu’:活性化関数 ReLU(Rectified Linear Unit)- ランプ関数」を使っています。
コード解説もしておきましたので、日々の学習にお役立てください。(オフラインでも学習しやすいように記事の内容を、PDFで公開してあります)
【オリジナルデータセットで機械学習に挑戦】
機械学習・人工知能プログラミングのオリジナルデータセットの壁を感じている方も多いのではないかと思います。
自作・自前画像で画像認識するためのサンプルコードを公開しました。日々の学習の参考になることがありましたら幸いです。
:【サンプルコード】Python・KerasでCNN機械学習。自作・自前画像のオリジナルデータセットで画像認識入門
:【コード解説】自作画像認識AI:Keras・CNN・Pythonオリジナルデータセット対応の機械学習サンプルコード