elevne's Study Note

딥러닝 파이토치 교과서 (4: 합성곱신경망 (1)) 본문

Machine Learning/Pytorch

딥러닝 파이토치 교과서 (4: 합성곱신경망 (1))

elevne 2023. 3. 4. 10:24

역전파의 계산 과정은 매우 복잡하고 많은 자원이 소모되며, 게산 시간도 상당히 오래걸린다. 합성곱신경망은 역전파의 이러한 문제점을 해결한다. 합성곱신경망은 이미지 전체를 한 번에 계산하는 것이 아니라, 이미지의 국소적 부분을 계산함으로써 시간과 자원을 절약하여 이미지의 세밀한 부분까지 분석할 수 있는 신경망이다.

 

 

 

기존의 신경망에서 이미지를 처리할 때는, n x n 배열을 n ** 2 길이의 벡터로 flatten 하여 픽셀에 가중치를 곱하여 은닉층으로 전달한다. 하지만 이는 이미지 데이터의 공간적인 구조를 무시하게 된다. 합성곱신경망을 사용하면 이미지 데이터의 공간적인 구조를 반영해줄 수 있다. 합성곱신경망은 입력층, 합성곱층, 풀링층, 완전연결층, 출력층 총 5 개의 계층으로 구성된다. 합성곱신경망은 합성곱층과 풀링층을 거치며 이미지의 주요 feature vector 을 추출하고, 추출된 feature vector 은 완전연결층을 거치며 1차원 벡터로 변환되며 마지막으로 softmax 를 거쳐 최종결과가 나오게된다.

 

 

 

 

 

 

입력층

 

입력층은 입력 이미징 데이터가 처음으로 들어오는 곳으로, 이는 단순 1 차원 데이터가 아닌 높이, 너비, 채널의 값을 갖는 3 차원 데이터이다. 이 때, 채널은 Gray scale 일 때는 1 값을 가지고 RGB 이면 3 값을 갖게되는 것이다. 

 

 

합성곱층

 

Convolutional Layer 은 입력데이터에서 특성을 추출하는 역할을 수행한다. 이 때 특성을 추출하기 위해 Kernel 이나 필터라는 것을 사용한다. 커널/필터는 이미지의 모든 영역을 훑으면서 특성을 추출하게 되는데, 이렇게 추출된 결과물이 feature map 이다. 커널은 3 x 3 혹은 5 x 5 로 적용되는 것이 일반적이고, Stride 라는 지정된 간격에 따라 순차적으로 이동한다. Gray Scale 의 이미지를 처리할 때는 이러한 특성추출을 하나의 2 차원 행렬에만 적용하는 것과 같지만, RGB 의 이미지를 처리할 때는 3 개의 2 차원 행렬을 처리하는 것과 같다. 이 때는 RGB 각각에 서로 다른 가중치로 합성곱을 적용한 후 결과를 더해주게 된다.

 

 

풀링층

 

Pooling Layer 은 feature map 의 차원을 다운 샘플링 (Sub-sampling 은 이미지를 축소하는 것을 의미함) 하여 연산량을 감소시키고, 주요 feature vector 을 추출하여 학습을 효과적으로 할 수 있게한다. 풀링은 Max poolingAverage pooling 으로 구분될 수 있다. Max pooling 은 feature map 에서 최대값을 추출하는 것이고, Average pooling 은 영역의 평균값을 반환하는 것이다. 대부분의 Convolutional Neural Network 에서는 Max pooling 이 사용되는데, 이는 Average pooling 이 커널 값을 평균화시켜 중요한 가중치를 갖는 값의 특성을 희미하게 할 수 있기 때문이라고 한다. 

 

 

완전연결층

 

Fully Connected Layer 에서 이미지는 3 차원에서 1 차원 벡터로 펼쳐지게 된다. 

 

 

출력층

 

Output layer 에서는 Softmax 가 사용되며, 입력받은 값을 0 ~ 1 사이의 값으로 출력한다. 

 

 

 

또, 합성곱은 이동하는 방향의 수와 출력 형태에 따라서 1D, 2D, 3D 로 분류할 수 있다고 한다.

 

 

1D 합성곱

 

1D 합성곱은 필터가 시간을 축으로 좌우로만 이동할 수 있는 합성곱이다. 예를 들어 입력이 [1, 1, 1, 1, 1] 이고 필터가 [0.25, 0.5, 0.25] 이라면 출력은 [1, 1, 1] 이 되는 것이다. 출력형태는 1D 배열이 되고, 그래프 곡선을 완화할 때 많이 사용된다고 한다.

 

 

2D 합성곱

 

이는 필터가 상하좌우로, 방향 두 개로 움직이는 형태이다. 출력형태는 2D 행렬이 된다. 3D 입력에도 2D 합성곱을 사용할 수 있다. 이러한 경우는, 필터에 대한 길이가 입력 채널의 길이와 같아서 합성곱이 가능해진 것이다. 입력 (W, H, L) 에 필터 (k, k, L) 을 적용하면 출력은 (W, H) 가 되는 것이다. 이러한 경우에서는 필터가 두 방향으로만 움직이고 출력형태는 2D 행렬이 된다. 이를 사용하는 대표적인 예로 LeNet-5, VGG 등이 있다. 또 1 x 1 합성곱이라는 것이 있는데, 이 때도 입력은 3D 형태이다. 입력 (W, H, L) 에 필터 (1, 1, L) 을 적용하면 출력은 (W, H) 가 된다. 1 x 1 합성곱에서 채널 수를 조정해서 연산량이 감소되는 효과가 있으며 대표적인 사례로는 GoogLeNet 이 있다.

 

 

3D 합성곱

 

이는 움직이는 방향이 3 개인 것이다. 물론 출력형태도 3D 행렬이다. 

 

 

 

다음 시간에는 CNN 을 직접 Pytorch 코드로 구현해볼 예정이다.

 

 

 

 

 

 

 

Reference:

딥러닝 파이토치 교과서