[혼공머신] Chapter8. 이미지를 위한 인공신경망 CNN

JB·2022년 3월 2일
0

혼공머신

목록 보기
8/9
post-thumbnail

혼공진도는 끝났지만 공부는 계속된다...왜냐면 걍 머...하다 끝내는 것보단 다 끝내는 게 더 간지나기 때문이다. 그리고 알아두면 언젠가 써먹겠찌 싶은 내용들이다. 연구실 담당 교수님이 아는 교수님의 CNN 강의 자료도 받아왔으니 계속 해보자


아래 내용은 <혼자 공부하는 머신러닝 + 딥러닝>과 숙명여자대학교 소프트웨어학부 <데이터사이언스개론> <빅데이터처리> 수업, 국립한국교통대학교 전자공학과 <딥러닝 인식 설계> 수업자료를 참고하여 작성한 내용입니다.

1. 합성곱 신경망의 구성 요소

합성곱 신경망

  • 합성곱 신경망(Convolution Neural Network) : 필터를 사용하여 유용망 특성만을 드러나게 하여 이미지를 '압축'하는 방식을 사용한다.

챕터7에서 했던 완전 연결 신경망은 모든 입력에 각 가중치를 곱하고 절편을 더한다. 따라서 입력이 10개라면 10개의 출력이 생기고, 1000개라면 1000개의 출력이 생긴다.
일단 2차원 이미지 데이터를 옆에 픽셀과의 관계 상관 없이 1차원으로 잘라버리기 때문에 연관성이 끊어질 수 있고 사용하는 노드(?), 입력(?)이 커진다. 컴퓨터가 많이 힘들어하고 정확도도 떨어지게 된다.

  • 필터(=커널) : 입력의 위를 이동하면서 해당 데이터의 출력값을 만들어냄.

입력 데이터가 4x4 짜리라면 3x3짜리 필터가 한 칸씩 이동하면서 출력값을 만들어낸다. (출처 : 딥러닝을 이용한 자연어처리 입문 11-1) 합성곱 신경망 - 합성곱 연산)

완전 연결 신경망이였다면 결과가 16개가 나왔겠지만 합성곱 연산을 거치면 4개로 줄어든다!

필터를 이동시켜가면서 단일 곱셈 누산(합성곱)을 수행하며 bias를 더해서 마무리(?)한다. 이렇게 나온 출력 데이터를 특성맵(feature map) 이라고 한다.
만약 여러개의 필터를 사용한다면 이런 특성맵이 N개가 된다.

케라스 합성곱 층

keras.layers 에 모두 구현되어 있다. 먼저 2D 입력은 Conv2D 클래스를 사용한다. tf.keras.layers.Conv2D(필터개수, 필터사이즈, 활성화함수) 로 사용할 수 있다.

  • 패딩(padding) : 합성곱 연산 전에 입력 데이터의 주변을 특정 값으로 채워서 결과값의 크기, 픽셀별 가중치를 조정할 수 있다.

다음과 같이 33 필터를 사용할 경우 44 입력 데이터에 상하좌우 1씩 패딩을 넣어서 입력과 출력 데이터 크기를 같게 만들어줄 수 있다.

다음과 같이 가장자리에 있는 입력 데이터가 합성곱에 참여하는 비율을 늘릴 수 있다. 좌측은 중앙과 4배 차이가 나지만 패딩을 한 우측은 2.25배 차이로 줄었다.

  • 스트라이드 : 오른쪽, 아래쪽으로 이동하는 크기가 기존에는 1칸씩이지만 이것으로 수정할 수 있다. 1보다 크게 사용하는 경우가 드물어서 default 1을 수정하지 않는 경우가 대부분이다.

여기까지 하면 출력 크기를 계산할 수 있는데 식은 다음과 같다.

입력 데이터 크기 = (vin,uin)(v_{in}, u_{in})
필터의 크기 = (fh,fw)(f_h, f_w)
패딩 = pp
스트라이드 = ss
출력의 크기 = (vout,uout)(v_{out}, u_{out})

vout=vin+2pfhs+1v_{out} = \frac{v_{in} + 2p - f_h}{s} + 1
uout=uin+2pfws+1u_{out} = \frac{u_{in} + 2p - f_w}{s} + 1



  • 풀링 : 특성맵의 세로/가로 크기를 줄이는 연산 -> 데이터를 압축함. 최대풀링, 평균풀링이 있으며 주로 최대 풀링(MaxPooling)을 사용한다.

(출처 : 딥러닝을 이용한 자연어처리 입문 11-1) 합성곱 신경망 - 풀링) 예를 들어, (4,4,3)을 (2, 2) 최대풀링을 적용하면 (2,2,3) 특성맵으로 맵의 크기가 줄어들고 갯수는 줄어들지 않는다.

특히 풀링은 겹치지 않기 때문에 풀링 크기에 따라서 이동한다.

다음 사진은 합성곱 신경망의 전체적인 구조이다. <혼자 공부하는 머신러닝+딥러닝> 437쪽에서 따온 이미지이다.
입력 데이터에 패딩을 설정하고 n개의 필터로 특성 맵 n개를 만든다. 특성맵을 최대 풀링을 사용하여 데이터를 압축하고 이후에 Flatten()으로 쭈욱 나열시켜서 밀집층으로 전달한다.



3차원 이미지를 위한 합성곱

RGB 채널로 구성된 이미지는 3차원이다. 이것은 3차원 데이터를 필터를 할 때 3장을 꾸욱 찍어낸다고 생각하면 좋다. 그 예시는 다음과 같다.

특성맵에 들어가는 값이 조금 커진다고 생각하면 좋을 것 같다.


2. CNN을 이용한 이미지 분류

fashion 데이터를 가져와서 앞에 배운 합성곱 신경망을 해보겠습니다!
8에 끝났습니다. 에폭6에서 최고 성능을 볼 수 있을 것 같습니다.
아무거나 하나를 뽑아서 출력해보니 가방이었고 예측값에 대한 플랏을 보니 인덱스9가 압도적으로 높습니다. 높은 확률로 가방이라는 뜻이죠?

테스트 결과 약 91% 정확도를 보입니다.



3. 합성곱 신경망의 시각화

가중치 시각화

체크포인트로 저장한 best model 을 가져와서 봅시다

model.layers 으로 불러오면 층에 대한 정보들이 나옵니다. 첫번째 합성곱층의 가중치를 봅시다. weights 속성에서 인덱스 0은 가중치이고 인덱스 1은 절편입니다. 모양으로 보아하니 (3, 3, 1, 32) 으로 잘 설정된 것 같습니다. 절편의 개수도 필터마다 1개 절편이므로 (32,) 로 잘 나왔습니다.
weights 속성으로 평균과 표준편차를 볼 수 있습니다.
가중치 분포를 히스토그램으로 확인해보면 다음과 같습니다. 훈련하지 않은 합성곱 신경망과 비교를 해봅시다. 왼쪽의 학습한 신경망은 0을 기준으로 정규분포를 따르지만 오른쪽의 학습하지 않은 빈 신경망은 랜덤하게 균등 분포된 것을 볼 수 있습니다. 가중치값을 그림으로 출력해본 것을 비교해보면
위의 커널은 가중치값에서 밝고 어두운 패턴을 볼 수 있지만 아래의 커널 그림들은 다소 규칙이나 차이를 찾아볼 수 없습니다!

특성맵 시각화

케라스로 중간의 Conv2D 층이 출력한 특성 맵을 가져와서 한 샘플을 입력해서 그 결과를 확인해보도록 하겠습니다. same 패딩과 32개 필터를 사용했으므로 특성맵의 크기는 (28, 28, 32) 이다.
32개 필터로 입력 이미지가 강하게 활성화된 부분을 볼 수 있습니다.
뒤에서 세번째 필터와 특성맵을 보면 필터는 중간에 세로로 밝은 부분이 있고 특성맵도 세로로 된 가장자리가 활성화되어 있는 것을 볼 수 있습니다.

두번째 층의 출력을 가져와서 봅시다. 위에서 64개 필터를 사용했고 첫번째 풀링에서 가로세로 크기가 절반으로 줄었으므로 (14, 14, 64) 특성맵이 나온다.

같은 부츠를 넣어서 출력해보겠다.
시각적으로 무엇을 했는지 이해가 가지 않지만 이미 한 층을 거렸으므로 시각적인 정보보다는 추상적인 정보를 학습한다고 봐야합니다. 층을 여러개 넣을 수록 비슷한 결과를 볼 수 있을 것이다.


챕터 8은 자주 사용하는 CNN 을 사용해보았다. 다만 연구를 하면서 사용하는 것은 이미지 처리 뿐만 아니라 차량 제어값(직전 제어값이 중요)도 같이 들어가기 때문에 이 제어값을 파싱해서 사용할 수 있는 chapter9의 순환신경망 내용을 공부해봐야겠다.

profile
자율주행 이동체를 배우고 있는 JB입니다.

0개의 댓글