일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 혼공머신
- 딥러닝
- 데이터베이스
- 중학1-1
- 정보처리기사실기
- 코딩테스트
- pandas
- 파이썬
- 자바 실습
- 영어공부
- JSP/Servlet
- 컴퓨터구조
- html/css
- 데이터입출력구현
- CSS
- 운영체제
- 파이썬라이브러리
- SQL
- 데이터분석
- 중학수학
- CNN
- 텍스트마이닝
- 자바
- C++
- 정수와유리수
- 연습문제
- 정보처리기사필기
- 컴퓨터비전
- numpy/pandas
- 머신러닝
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
이미지를 위한 인공 신경망 5 - 합성곱 신경망의 시각화 1 : 가중치 시각화 본문
이번에는 합성곱 신경망 시각화에 대해서 공부해 보겠다. 합성곱 층의 가중치와 특성 맵을 시각화 하여 신경망이 이미지에서 어떤 것을 학습하는지 이해해 본다.
시작하기 전에
이번 절에서는 합성곱 층이 이미지에서 어떤 것을 학습했는지 알아보기 위해 합성곱 층의 가중치와 특성 맵을 그림으로 시각화해 보겠다. 지금까지는 케라스의 Sequential 클래스만 사용했다. 케라스는 좀 더 복잡한 모델을 만들 수 있는 함수형 API를 제공한다. 함수형 API가 무엇인지 살펴보고 합성곱 층의 특성 맵을 시각화 하는 데 사용해 본다.
이전 절에서 훈련했던 합성곱 신경망의 체크포인트 파일을 사용한다. 이 파일은 최적의 에포크까지 훈련한 모델 파라미터를 저장하고 있다.
가중치 시각화
합성곱 층은 여려 개의 필터를 사용해 이미지에서 특징을 학습한다. 각 필터는 커널이라 부르는 가중치와 절편을 갖고 있다. 일반적으로 절편은 시각적으로 의미가 있지 않다. 가중치는 입력 이미지의 2차원 영역에 적용되어 어떤 특징을 크게 두드러지게 표현하는 역할을 한다.
예를 들어 다음과 같은 가중치는 둥근 모서리가 있는 영역에서 크게 활성화되고 그렇지 않은 영역에서는 낮은 값을 만들 것이다.
이 필터의 가운데 곡선 부분은 가중치 값은 높고 그 외 부분의 가중치 값은 낮을 것이다. 이렇게 해야 둥근 모서리가 있는 입력과 곱해져서 큰 출력을 만들기 때문이다.
그럼 앞에서 만든 모델이 어떤 가중치를 학습했는지 확인하기 위해 체크포인트 파일을 읽어 들이겠다.
하지만 오류가 뜨는데 best_cnn_model.h5 파일을 생성하지 않았기 때문이다. 2절에서 만들었던 코드를 다시 불러와서 코드를 생성해 보았다.
먼저 이 코드를 실행하자 체크포인트 파일을 읽을 수 있게 되었다. 케라스 모델에 추가한 층은 layers 속성에 저장되어 있다. 이 속성은 파이썬 리스트이다. model.layers를 출력해 보겠다.
책과 다르게 tensorflow.python.keras.layers가 앞에 출력되지 않아서 뭔가 잘못된 것 같아서 코드를 여러 번 수정했으나 그런 것 같지는 않았다.
Conv2D와 MaxPooling2D 층이 번갈아 2번 등장한다. 그다음 Flatten 층, Dence 층이 차례로 등장한다.
이제 첫 번째 합성곱 층의 가중치를 조사해보겠다. 층의 가중치와 절편은 층의 weifhts 속성에 저장되어 있다. 다음 코드에서 layers 속성의 첫번째 원소를 선택해 weights의 첫번째 원소(가중치)와 두 번째 원소(절편)의 크기를 출력해 보겠다.
이 합성곱 층에 전달되는 입력의 깊이가 1이므로 실제 커널 크기는 (3, 3, 1)이다. 또 필터 개수가 32개이므로 weights의 첫 번째 원소인 가중치의 크기는 (3, 3, 1, 32)가 되었다.
numpy() 메서드를 사용해 넘파이 배열로 변환하겠다. 그다음 가중치 배열의 평균과 ㅛ준편차를 넘파이 mean() 메서드와 std() 메서드로 변환한다.
이 가중치의 평균값은 0에 가깝고 표준편차는 0.22 정도이다. 나중에 이 값을 훈련하기 전의 가중치와 비교해 보겠다. 이 가중치가 어떤 분포를 가졌는지 직관적으로 이해하기 쉽도록 히스토그램을 그려보겠다.
hist() 함수에는 히스토그램을 그리기 위해 1차원 배열로 전달해야 한다. 이를 위해 넘파이 reshape 메서드로 conv_weights 배열을 1개의 열이 있는 배열로 변환했다.
이번에는 35개의 커널을 16개씩 두 줄에 출력해 보겠다. 이전 장에서 사용했던 맷플롯립의 subplots() 함수를 사용해 32개의 그래프 영역을 만들고 순서대로 커널을 출력한다.
앞에서부터 conv_weights에 32개의 가중치를 저장했다. 이 배열의 마지막 차원을 순회하면 0에서부터 i*16 + j번째까지의 가중치 값을 차례대로 출력한다. 여기서는 i는 행 인덱스이고, j는 열 인덱스로 각각 0~1, 0~15까지의 범위를 가진다.
결과 그래프를 보면 이 가중치의 값이 무작위로 내열된 것이 아닌 어떤 패턴을 볼 수 있다. 예를 들어 첫 번째 줄의 맨 왼쪽 가중치는 오른쪽 3픽셀의 값이 높다.
이번에는 훈련하지 않은 빈 합성곱 신경망을 만들어보겠다. 이 합성곱 층의 가중치의 가중치가 위에서 본 훈련한 가중치와 어떻게 다른지 그림으로 비교해 보겠다. 먼저 Sequential 클래스로 모델을 만들고 Conv2D 층을 하나 추가한다.
이 가중치의 평균과 표준편차를 확인해 보겠다.
평균은 이전과 동일하게 0에 가깝지만 표주편자는 이전과 달리 매우 작다. 이 가중치의 배열을 히스토그램으로 표현해 보겠다.
이전과 달리 비교적 고른 분포를 보인다. 이유는 텐서플로가 신경망의 가중치를 처음 초기화할 때 균등 분포에서 랜덤하게 값을 선택하기 때문이다. 이 가중치 값을 맷플롯립의 imshow() 함수를 사용해 이전처럼 그림으로 출력해 보겠다. 학습된 가 중치와 비교하기 위해 동일하게 vmin과 vmax를 -0.5와 0.5로 설정한다.
그림도 전체적으로 가중치가 밋밋하게 초기화되었다. 합성곱 신경망이 패션 MNIST 데이터셋의 분류 정확도를 높이기 위해 유용한 패턴을 학습했다는 것을 알 수 있다.
학습을 마치고
이미지 합성곱 학습이 얼마 남지 않았다. 오늘은 밤늦게 공부를 이어가려고 한다. 조금 전에 생성했던 코드는 최종 실습에 적용이 되지 않아서 다시 수정해 보았다. 코드의 결과도 확실히 달라졌음을 느낄 수 있었다.
'인공지능 > 딥러닝' 카테고리의 다른 글
CNN 1 - CNN 이미지 분석과 필터 그리고 패딩에 대하여 (0) | 2024.10.28 |
---|---|
이미지를 위한 인공 신경망 6 - 합성곱 신경망의 시각화 2 : 함수형 API 및 특성 맵 시각화 (0) | 2024.10.27 |
이미지를 위한 인공 신경망 4 - 합성곱 신경망을 사용한 이미지 분류 2 : 모델 컴파일과 훈련 (0) | 2024.10.27 |
이미지를 위한 인공 신경망 3 - 합성공 신경망을 사용한 이미지 분류 1 : 합성곱 신경망 만들기 (0) | 2024.10.27 |
이미지를 위한 인공 신경망 2 - 합성곱 신경망의 구성 요소 2 : 케라스 합성곱 층 및 합성곱 신경망의 전체 구조 (1) | 2024.10.27 |