畳み込みニューラルネットワーク

畳み込みニューラルネットワークとは

画像認識を行うために、以前から畳み込みという処理が行われていました。畳み込みを行うと画像の輪郭などを取り出すことができるので、どういう形をしているか把握するのに有用だったためです。単純にこの畳み込み処理をとりこんだのが、畳み込みニューラルネットワークでした。 畳み込みの処理はややわかりにくいところもあるので説明を割愛します。

畳み込みニューラルネットワークの実装

上で説明したように畳み込みの処理を導入しただけなので、model に1つの畳み込みを入れてみましょう。 コードは以下のとおりです。

import tensorflow as tf

input_shape =(28,28,1)
model = tf.keras.models.Sequential([
    tf.keras.layers.Reshape(input_shape),
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(10)
    ])

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])

model.fit(X_train, y_train, epochs=5)

畳み込みは Conv2D という関数で実行可能です。しかし、model に着目すると、Conv2D 以外にも Reshape とか Flatten とか入っています。これは何でしょうか。 Conv2D はもともと画像で利用されていて、また、2D とあるように、縦と横の情報が必要です。しかし、これまでMNISTのデータは 764個の1列の数値としてみていました。まずこれを Reshape を使って 28x28に戻しています。さらにいうと、画像はカラーチャンネル(白黒の場合は1, カラーの場合は3)がありますので、28x28x1に変えます。

Conv2D を実行するとこの出力は1列のデータではありません。最初のニューラルネットワークの図にあったように、Denseの入力は1列の数値です。そこで Flatten を使って1列の数値に直します。

Practice 13

上のコードを動かして、基本的な畳込みニューラルネットワークを試しましょう。

Point

model の部分を変えただけで精度が変化することを確認しましょう。