2021년 5월 27일 목요일

딥러닝 모델의 Convolution 필터 동작 구조

이 글은 딥러닝 모델의 컨볼루션 필터의 동작 구조를 설명한 것이다.

머리말
CNN(convolutional neural network)은 특정 방향의 모서리(edge)를 강조하는 edge detection, 상세를 강조해 blurring을 제거해주는 sharpness filter 등의 다양한 필터를 사용해 특징을 추출한다. 이를 컨볼루션 필터라 한다.

많은 컨볼루션 아키텍처는 채널 RGB의 입력 이미지를 일련의 내부 필터에 매핑하는 컨볼 루션으로 시작한다. 가장 많이 사용되는 딥러닝 프레임 워크에서 다음 코드는 많이 보여진다.

out_1 = Conv2d (input = image, filter = 32, kernel_size = (3,3), strides = (1,1))
relu_out = relu (out_1)
pool_out = MaxPool (relu_out, kernel_size = (2,2), strides = 2)

위의 결과는 32란 값은 일련의 필터들 갯수라는 것을 알고 있다. 다음 그림은 이 계산과정을 나타낸다.


1 단계 각 필터(filter-1, filter-2,… 등)가 3개 컨볼루션 커널(Wt-R, Wt-G 및 Wt-B)에 적용된다. 순방향 전파 중에 이미지의 R, G 및 B 픽셀 값이 각각 Wt-R, Wt-G 및 Wt-B 필터 커널에 곱해져 활성화 맵을 생성한다. 그런 다음 세 커널의 출력을 추가하여 필터 당 하나의 활성화 맵을 생성한다. 이러한 활성화는 ReLu 함수에 적용되고, 최대 풀링 계층을 통해 실행된다. 

컨볼루션 필터는 다음과 같은 종류가 있다. 
  • 1 차원 데이터에 대한 1D 컨볼 루션 (시간)
  • 2 차원 데이터에 대한 2D 컨볼 루션 (높이 및 너비)
  • 3 차원 데이터에 대한 3D 컨볼 루션 (높이, 너비 및 깊이)
Conv1D 
아이스크림 판매 예측의 경우를 보겠다. 입력은 시간적 차원에 따라 매일 간격으로 정의 될 수 있다. 제품 가격, 마케팅 지출, 외부 온도 및 주말인지 여부에 대한 정규화된 값을 가질 수 있다. 아래 경우는 총 4 개의 채널을 가진다. 
6 개의 시간에 걸쳐 4 개 채널이 있는 입력 배열

입력 데이터가 2차원처럼 보이지만, 차원 중 하나만 공간적이다. 4개 변수 (A, B, C, D)는 무작위 순서로 시작하면 A & B, B & C 및 C & D간에 유사한 공간 관계를 찾을 수 없다.
이러한 이유로 다중 채널 시간 데이터로 작업할 때는 1D Convolution을 사용하는 것이 가장 좋다. 
1x4 출력위해 4x6 입력 행렬에 적용 커널크기 3의 1D컨볼루션

컨볼루션 레이어에 입력 데이터를 필터가 순회하며 합성곱을 통해서 만든 출력을 피처맵(Feature Map) 또는 액티베이션 맵(Activation Map)이라고 한다. 액티베이션 맵은 피처맵 행렬에 활성 함수를 적용한 결과이다. 

앞의 과정은 다음 코드로 표현할 수 있다.

# input_data.shape는 (4, 6) 
# kernel.shape는 (4, 3)
conv = Conv1D (channels = 1, kernel_size = 3)
output_data = apply_conv (input_data, kernel, conv) 
print (output_data)
# [[[24. 25. 22. 15.]]] 

Conv2D 
컬러 이미지는 다중 채널 공간 데이터의 좋은 예이다. 다음 그림에서 각 위치 색상을 나타내는 3개의 채널이 있다. 
3 개 채널 표현

3x3 커널을 정의하더라도 3개 입력채널이 있어, 초기화될 때 커널의 실제 크기는 3x3x3이 될 것이다. 
3x3 출력 위해 크기 5x5인 3채널 RGB 입력에 3x3 커널을 적용한 2D 컨볼루션

# input_data.shape는 (3, 5, 5) 
# kernel.shape는 (3, 3, 3).
conv = Conv2D (channels = 1, kernel_size = (3,3))
output_data = apply_conv (input_data, 커널, conv) 
print (output_data)
# [[[[19. 13. 15.] 
# [28. 16. 20.] 
# [23. 18. 25.]]]] 
# <NDArray 1x1x3x3 @cpu (0)>

다중출력채널 컨볼루션
하나의 컨볼루션 필터만 사용하면, 너무 한정된 특징만 추출될 수 있다. 그러므로, 출력채널이 다중인 컨볼루션을 다음과 같이 사용할 수 있다.
컨볼루션 계층 4개 커널 출력 최대화

다중출력채널은 학습 시 주어진 클래스에 대한 이미지의 서로 다른 엣지, 색깔, 블롭(blob) 등에 활성화되는 필터들을 의미한다. 이를 입력 데이터와 계산하면, 결국 깊이값으로 표현되기 때문에, 깊이컬럼(depth column)이라 부르기도 한다.

여러 출력채널을 추가하면, 다음과 같이 계산된다. 
4x4 출력위해 크기 3커널 4개 1x6 입력 행렬에 적용한 1D컨볼루션

코드로 나타내면 다음과 같다.
# input_data.shape는 (1, 6) 
# kernel.shape는 (4, 1, 3)
conv = Conv2D (channels = 4, kernel_size = (3,3))
output_data = apply_conv (input_data, kernel, conv) 
print (output_data)
# [[[5. 6. 7. 2.] 
# [6. 6. 0. 2.] 
# [9. 12. 10. 3.] 
# [10. 6. 5. 5.]]] 

댓글 없음:

댓글 쓰기