einops 모듈을 이용하면 쉽게 grid로 자르고, 배치할 수 있다.
파이토치, 텐서플로우 레이어와도 쉽게 적용가능해서 VIT 구현에 사용해보려고 한다.
https://github.com/arogozhnikov/einops/tree/master/docs
공식 문서에 튜토리얼이 나와있다.
이를
이렇게 일정 간격으로 자르고자 한다.
from einops import rearrange
print(image.shape) # (1, 96, 96, 3)
patchs = rearrange(image, 'b (h s1) (w s2) c -> b (h w) s1 s2 c', s1 = 16, s2 = 16)
print(patchs.shape) # (1, 36, 16, 16, 3)
rearrange를 통해 가로세로 96인 이미지를 16의 크기를 갖도록 자르면 가로 6개, 세로 6개씩 잘려지며,
이를 (h, w)을 통해 나열하면 36개의 이미지 패치를 얻을 수 있다.
확인해 보면
plt.figure(figsize = (6,6))
for index in range(patchs.shape[1]):
plt.subplot(6, 6, index+1)
plt.imshow(patchs[0][index]) # patch size = (B=1, 36, 16, 16,3 )
plt.axis('off')
plt.show()
위와같이 6X6 gird 으로 잘림을 확인할 수 있다.
(1, D, H, W, C)의 shape인 3차원에서도 확인해보기