Shikata Ga Nai

Private? There is no such things.

43. CNNを使った画像分類の実践

Hello there, ('ω')ノ

📌 1. CNNとは? 基本構造と仕組み

✅ CNN(畳み込みニューラルネットワーク)とは?

CNNは、画像や動画などのデータを処理するためのディープラーニングモデル です。
人間の視覚に近い仕組みで、画像の特徴を抽出して分類します。

📌 CNNの基本構造

入力層 → 畳み込み層 → プーリング層 → 全結合層 → 出力層

入力層(Input Layer)
- 画像のピクセル情報を受け取る
- 例: 28x28 のグレースケール画像(MNIST)

畳み込み層(Convolution Layer)
- 特徴量マップ(Feature Map) を作成
- フィルタ(カーネル)が画像の特徴を抽出

活性化関数(ReLU)
- 非線形性を導入 して、学習の精度を高める

プーリング層(Pooling Layer)
- 特徴マップをダウンサンプリング(縮小) して計算量を削減
- 一般的に Max Pooling が使用される

全結合層(Fully Connected Layer)
- 畳み込み層で得た特徴を分類するために使用

出力層(Output Layer)
- 分類結果(Softmax関数) を出力


📌 2. CNNの主要な構成要素

✅ ① 畳み込み層(Convolution Layer)

畳み込み層は、フィルタ(カーネル) を画像にスライドさせながら、
特徴量マップ(Feature Map) を生成します。

📌 畳み込みの数式

[ \text{Feature Map} = \text{Input} \ast \text{Filter} + \text{Bias} ]

パラメータ 説明
カーネルサイズ フィルタの大きさ(例: 3x3, 5x5)
ストライド(Stride) フィルタをスライドさせる間隔
パディング(Padding) 画像の端を補完する方法(Same/Valid)

「畳み込み層で画像の特徴を抽出!」


✅ ② プーリング層(Pooling Layer)

プーリング層は、特徴マップをダウンサンプリング(縮小) することで、
計算コストを削減し、過学習を防ぐ役割 があります。

📌 主なプーリング手法

手法 説明
Max Pooling 最大値を取得(一般的に使用)
Average Pooling 平均値を取得
Global Average Pooling 特徴マップ全体の平均値

「プーリングで特徴マップを圧縮し、計算コストを削減!」


✅ ③ 全結合層(Fully Connected Layer, FC)

全結合層は、畳み込み層で抽出された特徴量を分類 する役割を持ちます。
- Flatten(平坦化) して1次元のベクトルに変換
- Dense層(FC層) でクラス分類

「最終的な予測結果を出力する重要な層!」


📌 3. CNNで画像分類を実装(Keras + TensorFlow)

✅ ① データの準備(MNISTデータセット)

まずは、KerasのMNISTデータセットを読み込みます。

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

# データの読み込み
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# データの形状を確認
print(f"Training data shape: {X_train.shape}")
print(f"Test data shape: {X_test.shape}")

# 画像データのリシェイプ(28x28 → 28x28x1)
X_train = X_train.reshape(-1, 28, 28, 1).astype("float32") / 255.0
X_test = X_test.reshape(-1, 28, 28, 1).astype("float32") / 255.0

MNISTデータセット(28x28の手書き数字)を読み込み!
ピクセル値を0〜1に正規化してモデルに入力!


✅ ② CNNモデルの構築

次に、CNNモデルを構築します。

# CNNモデルの構築
model = Sequential()

# 畳み込み層(32フィルタ, 3x3カーネル, ReLU)
model.add(Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1)))

# プーリング層(2x2)
model.add(MaxPooling2D(pool_size=(2, 2)))

# 畳み込み層(64フィルタ, 3x3カーネル, ReLU)
model.add(Conv2D(64, kernel_size=(3, 3), activation="relu"))

# プーリング層(2x2)
model.add(MaxPooling2D(pool_size=(2, 2)))

# Flatten(特徴量の平坦化)
model.add(Flatten())

# 全結合層(Dense)
model.add(Dense(128, activation="relu"))
model.add(Dense(10, activation="softmax"))  # 10クラス分類

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

# モデルの概要
model.summary()

畳み込み層(Conv2D)とプーリング層(MaxPooling2D)を追加!
Flatten → 全結合層(Dense)で最終分類!


✅ ③ モデルの学習

モデルの学習を実行します。

# モデルの学習
model.fit(X_train, y_train, epochs=10, batch_size=128, validation_split=0.2)

10エポックで学習を実行!
検証データでモデルの精度を確認!


✅ ④ モデルの評価と予測

テストデータでモデルの精度を確認します。

# モデルの評価
test_loss, test_acc = model.evaluate(X_test, y_test, verbose=0)
print(f"Test Accuracy: {test_acc:.4f}")

# 予測
import numpy as np
predictions = model.predict(X_test)
predicted_classes = np.argmax(predictions, axis=1)

テストデータでモデルの精度を評価!
クラスラベルの予測を取得!


📌 4. 転移学習を活用して高精度モデルを構築

✅ 転移学習とは?

転移学習(Transfer Learning) とは、
「事前学習済みモデル」を使って新しいタスクに適用する手法 です。
ResNet, VGG, EfficientNet などの強力なモデルを再利用
少ないデータでも高精度なモデルを構築できる!

📌 転移学習の利点 - 計算コストを大幅に削減
- 精度向上と過学習防止
- Kaggleの画像分類コンペで必須!


✅ 転移学習の実装(ResNet50)

from tensorflow.keras.applications import ResNet50
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Flatten, Input

# 事前学習済みResNet50の読み込み(トップ層は除く)
base_model = ResNet50(weights="imagenet", include_top=False, input_tensor=Input(shape=(224, 224, 3)))

# 特徴量の平坦化
x = Flatten()(base_model.output)

# 新しい全結合層を追加
x = Dense(256, activation="relu")(x)
x = Dense(10, activation="softmax")(x)

# モデルの定義
model = Model(inputs=base_model.input, outputs=x)

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

# モデルの概要
model.summary()

ResNet50の転移学習で高精度モデルを作成!
Kaggleコンペでも上位入賞を狙える手法!


📌 5. CNNの応用とKaggleでの活用ポイント

✅ KaggleでCNNを活用するコツ

データ拡張(Data Augmentation)で汎化性能を向上
転移学習で事前学習済みモデルを活用
アンサンブル学習(Bagging, Stacking)でスコアを底上げ
Early Stopping や Learning Rate Scheduler で過学習を防ぐ

📌 Kaggleの画像分類コンペの流れ

  1. EDA(データ探索) → データ分布・クラスの確認
  2. ベースラインモデルの作成(CNN or 転移学習)
  3. データ拡張で精度向上(Flip, Rotation, Zoom)
  4. モデルの最適化(Fine-Tuning, Early Stopping)
  5. アンサンブルでスコアを向上させる!

「CNN + 転移学習 + アンサンブル」でKaggleの上位入賞を狙おう!


🎯 まとめ

CNNは画像分類で最も強力なアルゴリズム!
畳み込み層・プーリング層・全結合層の役割を理解しよう!
Kerasを使って簡単にCNNモデルを構築・学習できる!
転移学習でResNetやEfficientNetを活用すれば高精度モデルも実現!
Kaggleの画像分類コンペで、CNNとアンサンブルを活用して上位入賞を目指そう!

Best regards, (^^ゞ