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の画像分類コンペの流れ
- EDA(データ探索) → データ分布・クラスの確認
- ベースラインモデルの作成(CNN or 転移学習)
- データ拡張で精度向上(Flip, Rotation, Zoom)
- モデルの最適化(Fine-Tuning, Early Stopping)
- アンサンブルでスコアを向上させる!
➡ 「CNN + 転移学習 + アンサンブル」でKaggleの上位入賞を狙おう!
🎯 まとめ
✅ CNNは画像分類で最も強力なアルゴリズム!
✅ 畳み込み層・プーリング層・全結合層の役割を理解しよう!
✅ Kerasを使って簡単にCNNモデルを構築・学習できる!
✅ 転移学習でResNetやEfficientNetを活用すれば高精度モデルも実現!
✅ Kaggleの画像分類コンペで、CNNとアンサンブルを活用して上位入賞を目指そう!
Best regards, (^^ゞ