1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

図解!VisionTransformerの入力画像のパッチ分割と埋め込みがなぜConv2Dで実現できるのか?

1
Posted at

背景

画像系の機械学習エンジニアとしてはいまさらながらなのですが、
以下の書籍を用いてVisiontransformerの理論と実装について、学びなおししています。

読み進めていると、第二章のInput layerの説明のところが目に留まりました。

PyTorchで用意されている畳み込み層nn.Conv2dを使えば、
「パッチへの分割」と「埋め込み」が1行でまとめてできるためです。

(中略)

この解説でわかりにくい場合は、実際に画像と畳み込みのカーネルを絵に描き、
カーネルサイズおよびストライドをバッチサイズにした際の
畳み込みの挙動を図示すると理解しやすくなります。

文字を見た瞬間だけだと理解しきれず、実装を見てもイメージできなかったので、
本に進められるがままに、図解して理解してみることにしました。

前提条件

以下のConv2dでパッチ分割と、埋め込みをすることを考えたい。

img_size = 81  # (3, 81, 81)
in_channel = 3
emb_dim = 128
patch_size_row = 3  # pathc num: 3 * 3 = 9
patch_size = img_size // patch_size_row  # 27

self.patch_embed = nn.Conv2d(
            in_channels=in_channel,
            out_channels=emb_dim,
            kernel_size=patch_size,
            stride=patch_size,
)

図解してみた

まず最初の畳み込みは、緑の部分が対象になる。
3 x 27 x 27のブロックを畳み込む。

スクリーンショット 2025-07-21 170617.png

アウトプットとしては以下のような図の対応関係になり、
128 x 1 x 1の出力が出てくる。

スクリーンショット 2025-07-21 170724.png

次はストライドが27なので、分割された次のブロック、つまり下図の青色が対象になる。
出力は同等で、今後は同じようなことを繰り返していくだけ。
パッチ画像のサイズ = ストライドのサイズ、とすることによって、パッチ画像ブロックごとに畳み込みをすることができ、結果埋め込みまでを1つの関数でやりきれる、というわけである。

スクリーンショット 2025-07-21 171131.png

まとめ

図示してみると、すんなり理解することができました。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?