Attention please

[딥러닝] im2col의 원리, im2col을 이용한 합성곱 본문

딥러닝/CNN

[딥러닝] im2col의 원리, im2col을 이용한 합성곱

Seongmin.C 2022. 12. 10. 03:09

2022.12.10 - [딥러닝/CNN] - [딥러닝] Max Pooling의 원리, 합성곱층과 max pooling층의 차이

 

Max Pooling

2022.12.09 - [딥러닝/CNN] - 텐서의 합성곱 텐서의 합성곱 2022.12.09 - [딥러닝/CNN] - 이미지와 텐서, 전치(transpose) 이미지와 텐서, 전치(transpose) CNN(합성곱 신경망) 앞으로 다룰 CNN - Convolution Neural Network

smcho1201.tistory.com

지난 글에서는 CNN을 구성하는 요소 중 2가지, convolution층과 max pooling층의 역할과 차이점에 대해 알아보았다. 이번 글에서는 4차원 텐서를 다루어야하는 CNN인 만큼 들어가는 코드가 복잡해지고 시간비용이 늘어나는 문제들이 생긴다. 이런 문제들을 해결하기 위해 고안된 im2col 기법에 대해 알아보자.

 

 

 

 

 

 

im2col이란 무엇인가?

CNN, 합성곱 신경망은 이미지와 영상을 다루는데 특화되어있는 신경망이다. 입력데이터로 들어온 이미지들의 특징들을 필터와의 합성곱으로 학습하는 것이 특징인데 여기에는 한가지 문제가 있다. 이미지는 3차원 텐서로 이루어져있으며 Batch를 하여 여러 이미지를 한번에 학습시킬 경우 4차원 텐서를 입력데이터로 넣어야 한다. 하지만 4차원 텐서같이 복잡한 다차원의 텐서를 반복문으로 내적하여 다시 array에 넣는 코드가 반복이 되는 만큼 시간은 오래걸린다. 이때 이 문제를 해결해주는 기법이 바로 im2col이다.

 

im2col의 핵심은 4차원 텐서를 2차원 텐서인 행렬로 바꾸어주는 것이다. 입력데이터를 행렬로 바꾸어주면 복잡했던 구현방식이 선형대수를 사용하여 훨씬 구현하는데 수월해지며, 한번의 행렬계산으로 합성곱을 할 수 있기때문에 계산 속도 역시 빨라진다.

 

하지만 이런 im2col 역시 단점은 존재한다. 합성곱은 1개의 픽셀이 여러번 합성곱에 사용될 수 있다. 물론 4차원 텐서를 그대로 합성곱을 할 때는 상관없지만 2차원 행렬로 바꾸어 계산을 진행하면 픽셀이 중복 등장하여 메모리를 더 차지할 수 있다. 하지만 이런 단점에도 불구하고 사용하는 이유는 늘어나는 메모리에 비해 향상되는 계산 속도가 훨씬 효과적이기 때문이다. (약 200배 속도 향상)

 

N=1 , C=1 , H=3 , W=3 , FN=1 , FH=2 , FW=2 , stride=1

 

이와 같이 im2col이 적용되면 filter의 개수가 2 x 2이고 stride가 1이기 때문에 x(11), x(13), x(31), x(33)을 제외한 나머지 원소들이 중복되어 행렬이 완성된 것을 볼 수 있다. 물론 픽셀이 중복되는 문제는 존재하지만 만들어진 행렬과 필터와의 단 한번의 행렬계산으로 결과가 도출되기에 구현이 훨씬 간단해진 것을 확인할 수 있다.

 

 

 

 

 

im2col을 이용한 합성곱

im2col을 하게 되면 입력데이터와 필터를 행렬로 바꾸어 행렬계산을 진행한다. 이는 역전파를 계산할 때에도 훨씬 직관적으로 바꾸어준다. 합성곱층을 Affine층의 계산으로 바꾸어주기 때문이다.

 

 

그렇다면 어떻게 합성곱이 행렬계산으로 변하는지 과정을 살펴보자.

 

  1. 입력데이터를 합성곱 순서대로 부분 tensor를 뽑아낸 후 모두 flatten을 시켜 각 행에 넣어 col이라는 행렬을 완성한다.
  2. 각 필터를 flatten하여 각 열에 넣어 colw라는 행렬을 만든다.
  3. 만든 두 행렬 col과 colw를 행렬계산한다.
  4. N x OH x OW x FN 으로 reshape한다.
  5. transpose(0,3,1,2)를 취해준다.

행렬내적을 한 후 나오는 출력데이터는 2차원 텐서이기 때문에 반드시 reshape을 하여 원래 합성곱의 결과로 나와야할 4차원 텐서의 형태로 만들어주어야 한다. 

 

이번에는 실제로 im2col을 적용하여 합성곱을 계산하였을때 어떤 과정을 거치는지 직접 계산을 해보면서 알아보자.

 

입력데이터는 1개의 이미지이며,  CHW = (2,3,3) 이다. 필터의 개수는 2개이며, 차원은 입력데이터의 차원의 개수와 같은 2개를 가지고 있으며, size는 2 x 2이다. stride가 1로 정해졌다고 가정하고 먼저 입력데이터와 필터를 행렬로 변환하자.

 

N=1 , C=2 , H=3 , W=3 , FN=2 , FH=2 , FW=2 , stride=1

 

다음과 같이 변환된 두 행렬을 곱하면 다음과 같은 결과가 나온다.

 

 

필터의 개수만큼 행렬의 열이 2개인 것을 확인할 수 있으며, 다음으로는 N x OH x OW x FN 으로 reshape을 해준다.

 

 

다음으로 원래 출력데이터의 축의 위치인 N x FN x OH x OW 으로 transpose를 해준다.

 

 

 

 

 

 

im2col은 합성곱을 사용하는 CNN 신경망에서의 필수적인 기법이다. 약간 늘어나는 메모리를 감수함으로써 얻는 이점들이 너무나도 많기 때문이다. 줄어드는 시간 비용, 코드의 간결화와 같은 장점 뿐만 아닌 역전파를 계산 하는 과정에서도 단순 선형대수의 계산이기 때문에 이해하기 쉬어진다는 장점들이 존재한다.

Comments