絶対腹落ちできる、Conv1×1解説
はじめに
Conv1×1って、CNN系のネットワークを見ているとちょいちょい出てきますよね。
でも最初は「1×1で畳み込むってどういうこと?意味あるの?」と思ってました。
3×3の畳み込みなら“周囲の情報を集める”って直感があるんですが、1×1はただの1ピクセル。隣も見ないし、広がりもない。それなのに、実はめちゃくちゃ使えるやつなんです。
今回は、「Conv1×1が何をしているのか」「どんな場面で使われているのか」を、できるだけ直感的に・図解的にまとめてみました!
Conv1×1は「チャンネル圧縮器」
よくあるケースを考えてみます。
CNNの中間層で、たとえばこんな特徴マップが出てきたとします。
入力特徴マップ: [バッチサイズ, チャンネル数, 高さ, 幅] = [1, 512, 32, 32]
この512チャンネルに、1×1の畳み込み(Conv2d(512, 256, kernel_size=1)) をかけると:
出力特徴マップ: [1, 256, 32, 32]
チャンネル数だけが512 → 256に減ったことがわかります。
ポイントは以下の通り:
- 高さと幅はそのまま(32×32)
- チャンネル方向(深さ)だけ変わる
- 各ピクセルの特徴ベクトル(512次元)に線形変換をかけて圧縮
つまり、空間は変えずにチャンネルだけ加工する畳み込みです。
これがConv1×1の役割です。
情報って削れてないの?
正直、ある程度は削れます。
でも、ここが重要で──
「必要な情報は残すように学習する」 のがこの操作のミソなんです。
CNNの特徴マップって、全チャンネルが平等に大事なわけではなくて、無駄な・似たような特徴 も含まれています。
そこを圧縮して、本当に必要な特徴だけ残す のがConv1×1の目的です。
Conv1×1は“PCAっぽい”
この操作、**主成分分析(PCA)**にめっちゃ似てるんですよね。
項目 | Conv1×1 | PCA |
---|---|---|
学習方法 | 誤差逆伝播で学習 | データの統計から固定的に計算 |
特徴の選択基準 | タスクに合わせて動的に重みを学習 | 分散が大きい方向を選ぶ(汎用的) |
出力 | 損失最小化に最適な特徴空間 | 分散が大きい成分を保持 |
Conv1×1は「タスク特化型の学習付きPCA圧縮器」 と言ってもいいと思います。
FPNなどでの使い道
Conv1×1の便利さがよく出るのが、Feature Pyramid Network(FPN) みたいな構造です。
FPNでは、複数層(C3〜C6など)の特徴マップを統合するんですが、各層でチャンネル数が違います:
層 | チャンネル数 |
---|---|
C3 | 256 |
C4 | 512 |
C5 | 1024 |
C6 | 2048 |
このままじゃ加算・統合できないので、全部1×1 Convで同じ数(例:256)に揃えて から合成します。
こうすることで、スムーズに融合できるんですね。
実際の動き:PyTorchで可視化してみる
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()
visualize_feature(input_feat, 'Input')
visualize_feature(output_feat, 'Output')
👀 実際に見てみると、
入力は64chで情報がごちゃごちゃしてたのが、16chに圧縮されて整理された感 があります。
「減った」というより「要点だけ残した」って感じですね。
まとめ
1×1 Convの役割 | なぜ使うのか |
---|---|
チャンネル数の変換(圧縮/展開) | 冗長な特徴を圧縮、必要な情報に絞り込む |
各ピクセルに線形変換をかける | 特徴に重み付けし、選別する |
空間情報は保持 | 位置情報はそのままで、チャンネルだけ加工 |
特徴マップの統合を可能にする | FPNなどでチャンネルを揃えて融合しやすくする |
PCA的な意味合い | タスク特化の“動的な”特徴圧縮 |
おわりに
Conv1×1、地味だけどめちゃくちゃ有能です。
自分も「これ何がいいの?」って長らく思ってたんですが、やっと腑に落ちました。
もし同じように「???」となっていた方の助けになれば嬉しいです。
Discussion