【Kerasリファレンス】Convolutional(畳み込み)レイヤー

2024年8月20日

イラスト出展:OpenAI dall-e-3

初めに

ディープラーニングのConvolutional(畳み込み)レイヤーについて説明するね。

Kerasのディープラーニングで利用できるConvolutional(畳み込み)レイヤーについて纏めました。

※ この記事はディープラーニングおよびKerasの知識がある方向けのリファレンスになります。

Convolutionレイヤー(畳み込み層)とは

Convolutionalレイヤー(畳み込み層)は、主に画像データに対して使用され、入力データから特徴を抽出するためのフィルターを適用するレイヤーです。これにより、特定のパターンやエッジを検出することができます。
Convolutionレイヤー

畳み込みとは

畳み込みとはフィルタ(カーネル)を平行移動しながら入力データに重ね足し合わせる二項演算です。畳み込みは画像解析において、画像の特長量を抽出する効果があります。

【畳み込みの仕組み】
畳み込み処理

Convolutionレイヤーを用いるディープラーニングのモデル

Convolutionレイヤー(畳み込み層)は主に画像認識を行うディープラーニングのCNNモデルで用いられます。CNNモデルはずばりConvolutional Neural Networkの略後で、畳み込み層とニューラルネットワークを併用することで高い画像精度の画像認識を行います。

【CNNモデルのイメージ】
CNNモデルのイメージ

CNNモデルを分かり易く喩えると『間違い探し』

CNNの仕組みを難しい専門用語を使わずに解説すると『全体を隅々まで見渡しつつ、細かいポイントを観察して画像を見分ける仕組み』です。
例えば間違い探しを考えてみます。
CNNの分かり易いたとえ

どうでしたか?間違いは見つかりましたか?間違いを見つける際に、全体の隅々までを細かく見て、更に細かく見ませんでしたか?
CNNの分かり易いたとえ
これがCNNです。CNNは全体を隅々までズームしてズームして特長を見つけます。

CNNの仕組みの詳細

CNNの詳しい仕組みについてはこちらの記事を参照ください。
https://postd.cc/how-do-convolutional-neural-networks-work/

Convolutionレイヤー(畳み込み層)の種類

Conv1D(1次元畳み込みレイヤー)

  • 説明
    Conv1Dレイヤーは、1次元の畳み込み演算を実行します。主に時系列データやテキストデータなどの1次元データに対して使用されます。
  • 使用例
    時系列データのパターン認識、テキストデータの特徴抽出など。

Conv2D(2次元畳み込みレイヤー)

  • 説明: Conv2Dレイヤーは、2次元の畳み込み演算を実行します。主に画像データなどの2次元データに対して使用されます。
  • 使用例: 画像の特徴抽出、物体検出、画像分類など。

Conv3D(3次元畳み込みレイヤー)

  • 説明: Conv3Dレイヤーは、3次元の畳み込み演算を実行します。主に3次元のデータ(例: 3D画像、ビデオ)に対して使用されます。
  • 使用例: 医用画像処理、動画解析、3D物体検出など。

Conv2DTranspose(2次元転置畳み込みレイヤー(デコンボリューション))

  • 説明: Conv2DTransposeレイヤーは、転置畳み込み演算を実行します。入力データを拡大して出力します。画像のアップサンプリングなどに使用されます。
  • 使用例: 画像の生成、スーパーレゾリューション、セグメンテーションなど。

SeparableConv2D(深さ方向に分離可能な2次元畳み込みレイヤー)

  • 説明: SeparableConv2Dレイヤーは、通常の畳み込み演算とは異なり、空間的な畳み込みとチャンネルごとの畳み込みを分離して実行します。計算コストを削減し、モデルのパラメータ数を減らす効果があります。
  • 使用例: 軽量なモデルの構築、モバイルアプリケーションでの使用など。

DepthwiseConv2D(深さ方向の畳み込みレイヤー)

  • 説明: DepthwiseConv2Dレイヤーは、各入力チャンネルごとに異なるフィルターを適用し、チャンネルごとの畳み込みを実行します。通常の畳み込みよりも計算コストが低いため、モバイルデバイスなどで使用されます。
  • 使用例: モバイルアプリケーション、リアルタイムの画像処理など。

CNNの実装サンプル(keras

以下は、Conv2Dレイヤーを使用した簡単なKerasの実装サンプルです。この例では、MNISTデータセットを使用して手書き数字の分類モデルを構築します。

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from keras.datasets import mnist
from keras.utils import to_categorical

# MNISTデータセットの読み込み
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# データの前処理
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

# モデルの構築
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))

model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='softmax'))

# モデルのコンパイル
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# モデルの学習
model.fit(train_images, train_labels, epochs=5, batch_size=64, validation_data=(test_images, test_labels))

# モデルの評価
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)

この例では、3つのConv2Dレイヤーを使用して畳み込みニューラルネットワークを構築し、MNISTデータセットの手書き数字の分類を行います。モデルのアーキテクチャは、畳み込み層とプーリング層を交互に重ね、最後に全結合層に接続します。

Kerasリファレンス

Kerasの詳しい使い方は本家の以下ページを参照下さい。
https://keras.io/api/

Keras

最後に

本記事がAIの理解に少しでもお役に立てば幸いです。機械学習など分かり易く記事にしていきますので今後とも宜しくお願いします。

一緒に楽しくAIについて学びましょう。

※ 本サイトの記事はより伝わり易い様にAIによりチェック・一部修正をしてます。