본문 바로가기
컴붕이의 감자 탈출기/함부로 딥러닝에게 덤비기

[Vision Transformer Image Classification] 1.Image Patch

by potato2brain 2026. 9. 13.

1. Vision Transformer 란?

Vision Transformer(ViT)는 Transformer구조를 이미지 처리에 적용하기 위해 나온 기술이다. Transformer는 원래 Sequence 데이터를 처리하기 위해 나온 모델이지만 이미지 데이터는 문장처럼 Sequence 데이터가 아니기 떄문에 이미지를 Transformer가 처리 할 수 있는 sequence로 변환해야 한다.

 

2. Image Patch

Coursera 강의를 들을 때 배웠던 내용이라 짧게만 설명하고 넘어가겠다. 예를 들어 이번 프로젝트에 쓸 데이터인 CIFAR-10 이미지를 보면 32x32x3 형태의 데이터로 돼 있는데 이 이미지를 nxn 짜리의 window를 통해 잘라주는 것이다. 만약 window가 4x4 라면 32/4 = 8 총 가로 8개 세로 8개로 8x8=64개의 작은 이미지 조각이 생기는 것이다. 우리가 NLP에서 문장을 토큰화 해서 하나의 토큰을 Transformer의 입력 단위로 사용했던 것 처럼 ViT 에서는 작은 이미지 조각인 Patch를 입력 단위로 사용하는 것이다. 위 이미지와 같이 보면 이해하기 쉬울 것이다.

 

3. CIFAR-10 Dataset

transform = transforms.ToTensor()

train_dataset = torchvision.datasets.CIFAR10(
    root="./data",
    train=True,
    download=True,
    transform=transform
)

image, label = train_dataset[0]

print(image.shape)
print(label)
torch.Size([3, 32, 32])
6
  • image : 모델에 들어갈 이미지 (3 x 32x 32 구조)
  • label : 해당 이미지의 정답클래스 (0 -> airplane 1-> automobile ... )

 

4. unfold()를 이용한 Patch Split

patch_size = 4

patches = image.unfold(1, patch_size, patch_size)
patches = patches.unfold(2, patch_size, patch_size)

print(patches.shape)
torch.Size([3, 8, 8, 4, 4])

unfold(dimension, size, step)

dimension : 어느 축을 자를 것인지

size : 한 조각의 크기

step : 몇 칸씩 이동할 것인지

각각 세로와 가로로 잘라야하기 때문에 지금은 두번 unfold 해 줬다.

사실 이것도 바로 잘라주는 tool이 있긴 하지만 굳이 사용하지는 않았다.

 

5. permute(), reshape로 Vector변환

앞선 결과 값을 보면 현재 patches의 값은 [C,H,W,Ph,Pw] 로 이루어져 있음을 알 수 있다. 하지만 우리는 결국 Transformer에 넣기 위해서 Vector값으로 바꿔야 하기 때문에 (Patch 개수, Patch 하나의 크기)  로 바꿔 줄 필요가 있다.

patches = patches.permute(1, 2, 0, 3, 4)
[8, 8, 3, 4, 4]

이렇게 바뀌게 되고

patches = patches.reshape(64, 48)

Patch의 개수 8x8 = 64, Patch 하나의 크기 3x4x4 = 48 이기 때문에 이 모양대로 reshape 시켜주면 하나의 이미지를 64개의 48차원 벡터로 변환이 끝난다.