Deepラーニングのメモです
986 views
畳み込みニューラルネットワーク(CNN)で頻繁に登場するけれど、「何のためにあるのかよくわからない」存在が Conv 1×1。
3×3の畳み込みは周囲の特徴を捉えるのはイメージしやすいですが、1×1って何してるの?意味あるの?と思ったこと、ありませんか?
今回は、Conv1×1が何をしているのか、どんな場面で役立つのかを具体例と共に解説します!
まず、よくあるケース。
CNNの途中で、例えば以下のような特徴マップが出てきたとします。
入力特徴マップ: [バッチサイズ, チャンネル数, 高さ, 幅] = [1, 512, 32, 32]
この512チャンネルの特徴マップに、1×1 Conv (in=512, out=256) を適用すると…
出力特徴マップ: [1, 256, 32, 32]
つまり、チャンネル数だけを512 → 256に削減します。
ポイントは:
これが Conv1×1の役割 です。
しかし問題なし。必要な情報は残るように学習するのがポイント。
項目 | 1×1 Conv (学習あり) | PCA (固定) |
---|---|---|
学習 | 誤差逆伝播で学習 | データの統計情報から事前計算 |
目的 | 損失関数を最小化するよう特徴選択 | 分散が大きい主成分を残す |
動的か静的か | 動的(タスクやデータに応じて変わる) | 静的(データ1セットから計算固定) |
つまり、1×1 Convは「タスク特化型のPCA圧縮器」と考えてOK!
代表的な使い道の一つが Feature Pyramid Network (FPN)。
FPNでは、複数層の特徴マップ(C3, C4, C5...) を組み合わせて使いますが、
層 | 特徴マップのチャンネル数 |
---|---|
C3 | 256 |
C4 | 512 |
C5 | 1024 |
C6 | 2048 |
チャンネル数がバラバラ!
そのままでは足し算・結合できないので、
→ 全部1×1 Convで同じチャンネル数(例えば256)に揃える!
こうすることで、スムーズに融合できます。
では、PyTorchで1×1 Convの動きを確認してみます。
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
# 仮の特徴マップ (batch=1, ch=64, 16x16)
input_feat = torch.randn(1, 64, 16, 16)
# 1x1 Convで 64 → 16 チャンネルに圧縮
conv1x1 = nn.Conv2d(64, 16, kernel_size=1)
output_feat = conv1x1(input_feat)
# 可視化関数
def visualize_feature(tensor, title):
fig, axs = plt.subplots(1, 5, figsize=(15, 3))
for i in range(5):
axs[i].imshow(tensor[0, i].detach().numpy(), cmap='viridis')
axs[i].set_title(f'{title} {i}')
axs[i].axis('off')
plt.show()
# 入力特徴の最初の5ch
visualize_feature(input_feat, 'Input')
# 出力特徴の5ch
visualize_feature(output_feat, 'Output')
1×1 Convの役割 | なぜ使うのか |
---|---|
チャンネル数を変換 (圧縮/展開) | 冗長な特徴を圧縮し、必要情報を選択 |
各ピクセルの特徴ベクトルに線形変換を適用 | 各特徴の重みを学習可能にする |
空間サイズはそのまま | 空間情報を保ったままチャンネルだけ操作できる |
FPNなどでチャンネル数を統一 | 特徴融合がスムーズ |
PCA的に情報圧縮 | 必要な特徴だけ残す(タスク特化型PCA) |
Page 11 of 33.
すぺぺぺ
本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/