【0から学ぶAI】第228回:CNNの実装 〜畳み込みニューラルネットワークを実装してみる

目次

前回のおさらいと今回のテーマ

こんにちは!前回は、Kerasを使ったモデル構築方法について解説しました。Kerasを使えば、シンプルな全結合ネットワークから複雑なカスタムネットワークまで、簡単に構築できることが分かりましたね。

今回は、ディープラーニングにおける代表的なモデルの一つである畳み込みニューラルネットワーク(CNN: Convolutional Neural Network)について解説します。CNNは、特に画像認識画像分類の分野で効果を発揮するモデルで、フィルターを使って画像から特徴を抽出し、分類や検出を行います。この記事では、Kerasを使ってシンプルなCNNを構築し、その動作を実践的に理解していきましょう。

CNNとは?

CNN(畳み込みニューラルネットワーク)は、画像データのパターンや特徴を効率的に抽出し、分類や検出を行うために設計されたニューラルネットワークの一種です。CNNは、以下の層を基本的な構成要素としています。

  1. 畳み込み層(Convolutional Layer): 画像データにフィルター(カーネル)を適用し、特徴マップを作成します。
  2. プーリング層(Pooling Layer): 畳み込み層の出力をダウンサンプリングし、計算量を減らすと同時に特徴の抽出を行います。
  3. 全結合層(Fully Connected Layer): 最終的に抽出された特徴を使ってクラス分類を行う層です。

CNNは、これらの層を積み重ねることで、画像の階層的な特徴を学習し、複雑なパターン認識を可能にします。

Kerasを使ったCNNの実装

それでは、Kerasを使ってシンプルなCNNを構築し、MNISTデータセット(手書き数字の画像データ)を分類するモデルを実装してみましょう。

1. 必要なライブラリのインポート

まず、TensorFlowとKerasのライブラリをインポートします。

import tensorflow as tf
from tensorflow.keras import layers, models

2. データセットの準備

MNISTデータセットを読み込み、データを正規化してCNNに適した形に変換します。

# データセットの読み込み
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

# データの形状を変更(28x28 -> 28x28x1)し、0-1にスケーリング
x_train = x_train.reshape((x_train.shape[0], 28, 28, 1)).astype('float32') / 255
x_test = x_test.reshape((x_test.shape[0], 28, 28, 1)).astype('float32') / 255

# ラベルデータをカテゴリカル(one-hot)に変換
y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)
  • reshape(): CNNに入力するために、28×28のグレースケール画像を28x28x1の形に変更します。
  • astype(‘float32’) / 255: ピクセル値を0から1の範囲に正規化します。
  • to_categorical(): 出力層が10クラス(0〜9)の分類を行うため、ラベルをone-hotベクトルに変換します。

3. CNNモデルの構築

次に、Kerasを使ってシンプルなCNNを構築します。

# モデルの定義
model = models.Sequential()

# 畳み込み層1とプーリング層
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))

# 畳み込み層2とプーリング層
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))

# 畳み込み層3
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

# フラット化して全結合層へ
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
  • Conv2D: 畳み込み層を追加します。32や64はフィルターの数で、(3, 3)はフィルターのサイズです。
  • MaxPooling2D: プーリング層を追加し、特徴マップをダウンサンプリングします。
  • Flatten: 3次元のデータを1次元にフラット化します。
  • Dense: 全結合層を追加し、出力層ではソフトマックス関数を使ってクラスの確率を出力します。

4. モデルのコンパイル

モデルをコンパイルして、損失関数、最適化アルゴリズム、評価指標を設定します。

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
  • optimizer=’adam’: Adamは効率的な最適化アルゴリズムで、深層学習に広く使用されます。
  • loss=’categorical_crossentropy’: 損失関数として多クラス分類に適したcategorical_crossentropyを指定します。
  • metrics=[‘accuracy’]: モデルの性能を正解率で評価します。

5. モデルの訓練

データセットを使ってモデルを訓練します。

history = model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.2)
  • epochs=10: データセットを10回繰り返して訓練します。
  • batch_size=64: 1回の更新で使用するサンプル数。
  • validation_split=0.2: 訓練データの20%を検証データとして使用します。

6. モデルの評価

テストデータを使って、モデルの性能を評価します。

test_loss, test_accuracy = model.evaluate(x_test, y_test)
print(f"Test accuracy: {test_accuracy:.2f}")

7. モデルの予測

訓練が完了したモデルを使って、テストデータで予測を行います。

predictions = model.predict(x_test)

# 最初の5つの予測結果を表示
for i in range(5):
    print(f"Actual: {tf.argmax(y_test[i])}, Predicted: {tf.argmax(predictions[i])}")
  • predict(): モデルがテストデータを使って予測を行います。
  • tf.argmax(): one-hotエンコーディングされた出力を元のクラスに変換します。

CNNの拡張とカスタマイズ

上記のシンプルなCNNをベースにして、さらに複雑なネットワークに拡張したり、カスタマイズすることが可能です。

ドロップアウト層の追加

ドロップアウト(Dropout)は、過学習を防ぐためにニューロンをランダムに無効化する層です。Kerasで簡単に追加できます。

model.add(layers.Dropout(0.5))

畳み込み層やプーリング層の追加

畳み込み層やプーリング層の数を増やすことで、ネットワークの学習能力を高めることができます。

model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))

まとめ

今回は、Kerasを使ってCNN(畳み込みニューラルネットワーク)を実装する方法について解説しました。CNNは画像認識や分類に非常に効果的で、画像データから階層的に特徴を抽出する構造がその強みです。基本的

な構築方法を学んだことで、他のデータセットやモデルでも応用できる基礎を身につけましたね。

次回予告

次回は、RNN(再帰型ニューラルネットワーク)の実装について解説します。RNNは、時系列データや自然言語処理に用いられるネットワークで、その特徴と基本的な実装方法を学びましょう!


注釈

  • 畳み込み層(Convolutional Layer): 画像にフィルターを適用し、特徴を抽出する層。
  • プーリング層(Pooling Layer): 特徴マップをダウンサンプリングし、計算量を減らす層。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社PROMPTは生成AIに関する様々な情報を発信しています。
記事にしてほしいテーマや調べてほしいテーマがあればお問合せフォームからご連絡ください。
---
PROMPT Inc. provides a variety of information related to generative AI.
If there is a topic you would like us to write an article about or research, please contact us using the inquiry form.

コメント

コメントする

目次