STEP 17:プーリング層

🔻 STEP 17: プーリング層

特徴マップを縮小して、効率的に情報を圧縮しよう

📋 このステップで学ぶこと

  • プーリング(Pooling)とは何か?
  • Max Poolingの仕組み
  • Average Poolingの仕組み
  • プーリングの効果(ダウンサンプリング、位置不変性)
  • Global Average Pooling
  • Kerasでの実装方法

🔻 1. プーリング(Pooling)とは?

1-1. プーリングの定義

プーリング(Pooling)は、特徴マップのサイズを縮小する操作です。
一定の領域から代表的な値を1つ取り出すことで、データを圧縮します。

📊 要約の例え

プーリングは「文章の要約」のようなものです。

元の文章:
「今日は朝から天気がとても良くて、空は青く澄み渡っていました」

要約(プーリング):
「今日は晴れ」

重要な情報だけを残して、データを小さくします。

1-2. プーリングの目的

✅ プーリングの3つの目的
  • 計算量の削減:特徴マップを小さくすることで、後続の層のパラメータ数を減らす
  • 位置不変性の獲得:特徴の「正確な位置」よりも「存在するかどうか」を重視
  • 過学習の抑制:情報を圧縮することで、細かいノイズに依存しにくくなる

⬆️ 2. Max Pooling(最大値プーリング)

2-1. Max Poolingの仕組み

Max Poolingは、指定した領域の中で最大値を取り出す操作です。
最も一般的なプーリング手法で、CNNでは標準的に使われます。

以下の図は横スクロールできます。

【Max Pooling(2×2、ストライド2)の例】 入力(4×4) 出力(2×2) ┌────┬────┬────┬────┐ ┌────┬────┐ │ 1 │ 3 │ 2 │ 4 │ │ 5 │ 6 │ ├────┼────┼────┼────┤ → ├────┼────┤ │ 5 │ 2 │ 6 │ 1 │ │ 8 │ 9 │ ├────┼────┼────┼────┤ └────┴────┘ │ 7 │ 8 │ 3 │ 9 │ ├────┼────┼────┼────┤ │ 4 │ 1 │ 5 │ 2 │ └────┴────┴────┴────┘ 【計算】 左上の2×2領域:max(1, 3, 5, 2) = 5 右上の2×2領域:max(2, 4, 6, 1) = 6 左下の2×2領域:max(7, 8, 4, 1) = 8 右下の2×2領域:max(3, 9, 5, 2) = 9 → 4×4が2×2に縮小された!(1/4のサイズ)

2-2. なぜMax Poolingが有効?

📌 Max Poolingが有効な理由

畳み込み層で検出された「特徴の強さ」を表す値のうち、
最も強い反応を残すことで、重要な特徴を保持します。

「この領域のどこかにエッジがある」という情報を圧縮して伝えます。

2-3. パラメータ

パラメータ 説明 一般的な値
pool_size プーリングする領域のサイズ (2, 2)
strides ウィンドウを動かす幅 (2, 2) または pool_sizeと同じ
padding パディング方法 ‘valid’(デフォルト)

📊 3. Average Pooling(平均値プーリング)

3-1. Average Poolingの仕組み

Average Poolingは、指定した領域の平均値を取り出す操作です。

【Average Pooling(2×2、ストライド2)の例】 入力(4×4) 出力(2×2) ┌────┬────┬────┬────┐ ┌────┬────┐ │ 1 │ 3 │ 2 │ 4 │ │ 2.75│ 3.25│ ├────┼────┼────┼────┤ → ├────┼────┤ │ 5 │ 2 │ 6 │ 1 │ │ 5 │ 4.75│ ├────┼────┼────┼────┤ └────┴────┘ │ 7 │ 8 │ 3 │ 9 │ ├────┼────┼────┼────┤ │ 4 │ 1 │ 5 │ 2 │ └────┴────┴────┴────┘ 【計算】 左上:(1+3+5+2)/4 = 11/4 = 2.75 右上:(2+4+6+1)/4 = 13/4 = 3.25 左下:(7+8+4+1)/4 = 20/4 = 5.0 右下:(3+9+5+2)/4 = 19/4 = 4.75

3-2. Max PoolingとAverage Poolingの比較

📊 Max Pooling vs Average Pooling

Max Pooling:
✅ 最も強い特徴を保持
✅ エッジ検出などに有効
✅ 一般的に高い性能
❌ 細かい情報が失われやすい

Average Pooling:
✅ 全体的な情報を保持
✅ 滑らかな特徴に有効
❌ 強い特徴が薄まる可能性

→ 一般的にはMax Poolingが使われる

🌐 4. Global Average Pooling

4-1. Global Average Poolingとは?

Global Average Pooling(GAP)は、各チャンネルの全体の平均を取る操作です。
特徴マップを1つの値に圧縮します。

【Global Average Poolingの例】 入力(4×4×3チャンネル) チャンネル1(4×4) チャンネル2(4×4) チャンネル3(4×4) ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ │ 1 │ 2 │ 3 │ 4 │ │ 2 │ 4 │ 6 │ 8 │ │ 0 │ 1 │ 0 │ 1 │ │ 5 │ 6 │ 7 │ 8 │ │10 │12 │14 │16 │ │ 1 │ 0 │ 1 │ 0 │ │ 9 │10 │11 │12 │ │18 │20 │22 │24 │ │ 0 │ 1 │ 0 │ 1 │ │13 │14 │15 │16 │ │26 │28 │30 │32 │ │ 1 │ 0 │ 1 │ 0 │ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ ↓ Global Average Pooling ↓ 出力(3次元ベクトル) [8.5, 17.0, 0.5] チャンネル1の平均:(1+2+…+16)/16 = 136/16 = 8.5 チャンネル2の平均:(2+4+…+32)/16 = 272/16 = 17.0 チャンネル3の平均:(0+1+…+0)/16 = 8/16 = 0.5

4-2. GAPの利点

✅ Global Average Poolingの利点
  • Flattenの代替:全結合層への接続をスムーズに
  • パラメータ削減:Flatten + Denseよりも大幅にパラメータが少ない
  • 過学習の抑制:パラメータが少ないため
  • 入力サイズの柔軟性:異なるサイズの画像にも対応可能

💻 5. Kerasでの実装

5-1. MaxPooling2D

from tensorflow.keras.layers import MaxPooling2D # Max Poolingレイヤー MaxPooling2D( pool_size=(2, 2), # 2×2の領域からmax strides=(2, 2), # 2ピクセルずつ移動 padding=’valid’ # パディングなし )

5-2. AveragePooling2D

from tensorflow.keras.layers import AveragePooling2D # Average Poolingレイヤー AveragePooling2D( pool_size=(2, 2), strides=(2, 2) )

5-3. GlobalAveragePooling2D

from tensorflow.keras.layers import GlobalAveragePooling2D # Global Average Poolingレイヤー GlobalAveragePooling2D() # パラメータなし!

5-4. CNNモデルでの使用例

from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical # データ準備 (X_train, y_train), (X_test, y_test) = mnist.load_data() X_train = X_train.reshape(-1, 28, 28, 1) / 255.0 X_test = X_test.reshape(-1, 28, 28, 1) / 255.0 y_train = to_categorical(y_train) y_test = to_categorical(y_test) # CNNモデル(Conv + Poolingの典型的な構造) model = Sequential([ # 第1ブロック:Conv → Pool Conv2D(32, (3, 3), padding=’same’, activation=’relu’, input_shape=(28, 28, 1)), MaxPooling2D(pool_size=(2, 2)), # 28×28 → 14×14 # 第2ブロック:Conv → Pool Conv2D(64, (3, 3), padding=’same’, activation=’relu’), MaxPooling2D(pool_size=(2, 2)), # 14×14 → 7×7 # 全結合層 Flatten(), # 7×7×64 = 3136次元 Dense(128, activation=’relu’), Dropout(0.5), Dense(10, activation=’softmax’) ]) model.compile(optimizer=’adam’, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) model.summary()
実行結果:
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 28, 28, 32)        320       
 max_pooling2d (MaxPooling2D)(None, 14, 14, 32)        0         ← パラメータなし!
 conv2d_1 (Conv2D)           (None, 14, 14, 64)        18496     
 max_pooling2d_1 (MaxPooling)(None, 7, 7, 64)          0         ← パラメータなし!
 flatten (Flatten)           (None, 3136)              0         
 dense (Dense)               (None, 128)               401536    
 dropout (Dropout)           (None, 128)               0         
 dense_1 (Dense)             (None, 10)                1290      
=================================================================
Total params: 421,642

※ プーリング層はパラメータを持たない(学習なし)
※ 前回(STEP 16)のモデルより大幅にパラメータ削減!

5-5. 学習と評価

# 学習 history = model.fit( X_train, y_train, epochs=10, batch_size=128, validation_split=0.2 ) # 評価 test_loss, test_acc = model.evaluate(X_test, y_test) print(f”\nテスト精度: {test_acc:.4f}”)
実行結果:
Epoch 1/10
375/375 - accuracy: 0.9456 - val_accuracy: 0.9812
...
Epoch 10/10
375/375 - accuracy: 0.9945 - val_accuracy: 0.9901

テスト精度: 0.9912

→ MLPより高い精度!CNNの威力を実感

📝 STEP 17 のまとめ

✅ このステップで学んだこと
  • プーリング:特徴マップを縮小する操作
  • Max Pooling:領域内の最大値を取る(最も一般的)
  • Average Pooling:領域内の平均値を取る
  • Global Average Pooling:チャンネル全体の平均を取る
  • プーリングの効果:計算量削減、位置不変性、過学習抑制
  • パラメータなし:プーリング層は学習するパラメータを持たない
💡 覚えておくべきコード
# Max Pooling(最も一般的) MaxPooling2D(pool_size=(2, 2)) # 典型的なCNNブロック Conv2D(32, (3, 3), activation=’relu’) MaxPooling2D(pool_size=(2, 2))
🚀 次のステップへ

畳み込み層とプーリング層を理解したので、次のSTEP 18ではCNNアーキテクチャの構築を学びます。

CIFAR-10データセットを使って、カラー画像の分類に挑戦しましょう!

📝 練習問題

問題1 やさしい

プーリングの目的

プーリングの目的として、正しくないものを選んでください。

  • A. 特徴マップのサイズを縮小する
  • B. 計算量を削減する
  • C. 新しい特徴を学習する
  • D. 位置不変性を獲得する
正解:C

プーリング層はパラメータを持たず、新しい特徴を「学習」することはありません。単に決められた操作(max, averageなど)を適用するだけです。

問題2 やさしい

Max Poolingの計算

以下の2×2領域にMax Poolingを適用した結果はいくつになりますか?
[3, 7]
[1, 5]

  • A. 1
  • B. 4
  • C. 5
  • D. 7
正解:D

Max Poolingは領域内の最大値を取ります。max(3, 7, 1, 5) = 7

問題3 ふつう

出力サイズの計算

入力サイズが16×16、pool_size=(2, 2)、strides=(2, 2)のMax Poolingを適用した場合、出力サイズはいくつになりますか?

  • A. 4×4
  • B. 8×8
  • C. 14×14
  • D. 16×16
正解:B
出力サイズ = 入力サイズ / ストライド = 16 / 2 = 8 2×2プーリング、ストライド2では、 サイズが縦横それぞれ半分になる。
問題4 むずかしい

Global Average Poolingの出力

入力形状が(None, 7, 7, 512)の特徴マップにGlobalAveragePooling2Dを適用した場合、出力形状はどうなりますか?

  • A. (None, 7, 7, 1)
  • B. (None, 1, 1, 512)
  • C. (None, 512)
  • D. (None, 3584)
正解:C
Global Average Poolingは各チャンネルの平均を計算: 入力:(None, 7, 7, 512) 7×7のマップが512チャンネル GAP後:各チャンネルが1つの値に → 512個の値 出力:(None, 512) これにより、Flattenを使わずに全結合層に接続できる。
📝

学習メモ

ディープラーニング基礎 - Step 17

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE