【Kerasの使い方解説】input_shapeの意味・用法

input_shape(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)の解説

:Kerasでconv2dを使う際に、始めにinput_shapeを指定します。
今回のコードは、0~9の手書き文字MNISTのデータセット(訓練用画像データ6万枚・テスト用画像データ1万枚。縦28×横28ピクセル・グレースケールの白黒画像)で「畳み込みニューラルネットワーク」(CNN:Convolutional Neural Network)を実装する際の例です。
縦28・横28ピクセルのグレースケール(白黒画像)を入力しています。カラーの場合はinput_shape=(28, 28, 3)になります。

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ピクセルのグレースケール(白黒画像)を入力しています。カラーの場合はinput_shape=(28, 28, 3)になります。

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 | すぐに使える「input_shape」を使ったサンプルコード(Keras・CNN・MNIST・自作AI用)

 

 

【コード解説】畳み込みニューラルネットワーク(CNN)サンプルコード – Colaboratory・Keras・MNIST

クラウド上で無料で使えるJupyterノートブック環境「 Google Colaboratory 」でKerasを使ってMNISTの数字画像認識用に、ディープラーニング(深層学習)でおなじみの「畳み込みニューラルネットワーク」(CNN:Convolutional Neural Network)のプログラミングをしてみました。機械学習モデルの畳み込みニューラルネットワークを実装する際に「input_shape」を使っています。
コード解説もしておきましたので、日々の学習にお役立てください。(オフラインでも学習しやすいように記事の内容を、PDFで公開してあります)

【オリジナルデータセットで機械学習に挑戦】

機械学習・人工知能プログラミングのオリジナルデータセットの壁を感じている方も多いのではないかと思います。
自作・自前画像で画像認識するためのサンプルコードを公開しました。日々の学習の参考になることがありましたら幸いです。

【サンプルコード】Python・KerasでCNN機械学習。自作・自前画像のオリジナルデータセットで画像認識入門 

【コード解説】自作画像認識AI:Keras・CNN・Pythonオリジナルデータセット対応の機械学習サンプルコード

 




 

by 子供プログラマー | プログラミング入門ウェブ教室