일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 텍스트마이닝
- 정보처리기사필기
- 데이터입출력구현
- CSS
- 중학1-1
- 정보처리기사실기
- 운영체제
- pandas
- 딥러닝
- 데이터분석
- 코딩테스트
- 컴퓨터비전
- 혼공머신
- 자바 실습
- 머신러닝
- 자바
- 파이썬라이브러리
- JSP/Servlet
- 데이터베이스
- CNN
- 컴퓨터구조
- html/css
- SQL
- 파이썬
- C++
- 연습문제
- 정수와유리수
- 중학수학
- numpy/pandas
- 영어공부
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
합성곱 신경망 3 - 간단한 모델 생성 2 : 모델 구조 파악 본문
어제 공부한 시간을 체크해 보니 무려 18시간이나 되었다. 잠자는 시간을 빼고 모두 공부를 했다는 말이었다. 어제는 딱 1시간을 잤지만 오늘을 6시간을 푹 자고 일어나니 몸과 마음이 정말 개운하니 좋았다. 어제를 마지막으로 2가지를 끊어보기로 했다. 15년도 넘게 되지 않았던 부분이지만 올해가 가기 전에 반드시 이루려고 한다.
기록을 초기화하려고 일부러 이틀 동안 루틴 설정을 하지 않았지만 다시 루틴과 함께 하루를 시작해 본다. 루틴 앱이 없이도 얼마나 잘할 수 있는지 스스로를 테스트해보고 싶었다. 근데 정말 잘할 수 있다는 걸 알게 되었다. 그럼 공부를 바로 시작해 볼 것이다.
모델 구조 파악
모델 인스턴스에 summary() 메서드를 적용해 주면, 모델의 구조를 요약해서 보여준다. 각 레이어의 이름과 출력 텐서의 형태, 그리고 각 레이어를 구성하는 파라미터(가중치) 개수를 알 수 있다.
(28, 28, 1) 형태의 입력 텐서가 Conv3D를 거치면서 (26, 26, 32) 형태로 변환된다. (3, 3) 크기의 합성곱 필터를 사용하기 때문에 이미지 가로, 세로 크기가 2씩 줄어든다(여기서 패딩은 적용되지 않음). 서로 다른 32개의 필터를 적용했기 때문에 (26, 26) 크기의 특성맵이 32개 생성된다. 즉 (28, 28, 1) 이미지에 서로 다른 32개의 커널을 적용해서 32가지 종류의 피쳐(특징)를 추출하는 것이다.
(2, 2) 크기의 풀링 레이어를 적용했기 때문에 이미지 크기가 1/2로 줄어든다. 따라서 풀링 레이어를 거지면 (13, 13, 32) 텐서로 변환되고 Flatten 층에서 3차원 텐서를 1차원 텐서로 펼치면 5408개(13 x 13 x 32) 원소를 갖는 1차원 벡터가 된다.
이 벡터를 출력 노드 10개인 Dense 레이어로 보내면 최종 분류 값을 예측해 출력한다. 즉, 이미지를 입력받아 특징을 추출하고 이미지가 나타내는 숫자를 예측할 수 있다.
생성된 모델 인스턴스의 input 속성으로부터 입력 레이어의 텐서를 추출할 수 있다. 입력 텐서는 (None, 28, 28, 1) 형태인데, 가장 앞에 있는 축(axis = 0)의 None 값은 배치 크기가 들어오는 크기로서 배치 크기로 어떤 값이든 가능하다는 의미이다.
원래는 mode.input으로 형태를 출력하는 건데 아무리 코드를 수정해도 되지 않았다. 이 오류는 여전히 Sequential 모델의 input 속성이 활성화되지 않았음을 의미한다. model.fit()을 이미 호출했으므로 이 방법이 작동해야 하지만, 특정 환경에서 Sequential 모델의 input 속성이 활성화되지 않는 경우가 있을 수 있다. 이럴 때는 tf.keras.Input을 사용해 명시적으로 입력 텐서를 정의한 후 Sequential 모델을 생성하면 model.input에 접근할 수 있다.
이 부분도 책에 있는 코드와 너무 다르다. 어쨌든 해결을 해서 다행이다. 모델의 출력 텐서는 ouput 속성으로 선택할 수 있다. 10개의 노드를 갖는 1차원 벡터 형태다.
모델을 구성하는 레이어들을 추출하려면 layers 속성을 확인한다. 파이썬 리스트 형태로 레이어 객체를 담아서 보여준다.
우리가 작성한 모델은 4개의 레이어로 구성된다. 파이썬 리스트 인덱싱을 적용해서 첫 번째 레이어를 선택하면 다음과 같다. 첫 번째 인덱스는 0이고, 가장 앞에 있는 Conv2D 레이어를 추출하게 된다.
각 레이어에 입력되는 텐서를 따로 선택하는 것도 가능하다 앞의 Conv2D 레이어에는 모델의 입력 데이터가 그대로 들어가기 때문에 (None, 28, 28, 1) 형태를 갖는다.
하지만 레이어층에 아무것도 출력이 되지 않았다. model.layers[0].input이 빈 리스트 []로 출력되는 이유는 모델이 아직 호출되지 않았거나, Sequential 모델이 자동으로 입력을 정의하지 않은 경우일 수 있다. Sequential 모델에서는 모델을 한 번 호출하여 입력을 활성화해야 레이어의 input 속성을 올바르게 확인할 수 있다.
코드를 수정했으나 여전히 입력은 []이었다. 그냥 넘어가기로 했다. 책에서 코드가 틀린 문제니까.
각 레이어에서 출력되는 텐서를 확인할 수 있다. Conv2D 레이어를 거치면 픽셀 사이즈가 2씩 줄어들고 채널 수가 32개로 늘어난다는데 내가 작성한 코드는 입력이 없었으므로 이런 부분이 하나도 반영되지 않았다.
각 레이어의 가중치 행렬을 추출할 수 있다. weights 속성을 각 레이어의 인스턴스에 적용하면 된다. 앞선 단원에서 텐서플로 변수(tf.Variable)는 가중치와 같이 모델 학습 과정에 값이 업데이트되는 경우 사용한다는 것을 배웠다. 다음 코드의 실행 결과를 보면, 2개의 텐서플로 변수 행렬이 확인된다. 첫 번째 변수는 행렬의 가중치를, 두 번째 변수는 각 커널의 상수항을 나타낸다.
첫 번째 레이어의 가중치가 []으로 출력되어 두 번째 레이어로 바꾸어보았다.
가중치와 상수항을 따로 선택해보겠다.
레이어의 이름을 사용하여 해당 레이어를 선택할 수 있다. 모델을 정의할 때 Conv2D 합성곱 레이어의 이름을 'conv'라고 지정해 두었기 때문에 다음과 같이 추출 가능하다.
이 코드로 책에 있는 코드 결과와는 너무도 다르다. 모델에 입력 데이터를 넣어주고, 첫 번째와 두 번째 레이어의 출력을 최종 출력으로 갖는 activator 모델을 정의한다. 첫 번째 샘플에 대하여 각 레이어의 출력을 예측한다.
2개의 출력 텐서 중에서 첫 번째 텐서는 Conv2D 레이어의 출력이다. 텐서의 형태는 (1, 28, 28, 1)인데, 여기서 앞의 1은 입력 이미지의 개수를 나타낸다. 샘플이 1개라는 뜻이다. 월래는 (1, 26, 26, 32)로 출력되어야 하는데 잘 안되었다.
첫 번째 레이어에서 출력되는 특성맵의 이미지를 32개의 커널로 구분하여 시각화하는 코드지만 내가 작성한 코드에서 입력이 없어 이 코드를 작성하면 오류가 뜬다.
딱 1개의 이미지만 나왔다.
두 번째 레이어는 최대 풀링 레이어다. 여기서 출력하는 텐서도 원래는 (1, 13, 13, 32) 형태여야 하지만 내 코드는 다음과 같다.
각 커널별로 출력되는 특성맵 이미지를 시각화하면, 앞서 Conv2D 출력 이미지에 비해 화소의 크기가 굵어진 것을 확인할 수 있다. 최대 폴링은 인근 픽셀들을 모아서 최댓값으로 고정하기 때문이다. 하지만 여기 내 코드로는 확인되지 않았다.
그래도 이번에는 이렇게 커널별로 나누어서 출력이 된다는 점이다.
학습을 마치고
오늘 새벽에 1시간 반 동안 공부를 진행했으나 안 되는 코드가 너무나도 많아서 원하는 결과를 내지 못해 마음이 안 좋았다. 중간에 이 단원 학습을 중단하고 싶은 마음이 들기도 했으나 참고 끝까지 진행해 보았다. 그래야 어디가 문제인지 알고 다음에 다시 시도할 수 있기 때문이다.
책을 만들 때 이런 부분까지 세세하게 신경을 써야 하는데 틀린 코드가 정말 많아서 책의 유명세에 비해 무척이나 실망스러웠다. 이번 단원은 맞는 코드보다 틀린 코드가 더 많았다. 그래도 이렇게나마 실습을 진행하며 레이어 층을 확인하고 결과단순한 모델을 생성하는 법을 배울 수 있었다.
'인공지능 > 딥러닝' 카테고리의 다른 글
합성곱 신경망 5 - 복잡한 모델 생성 2 : 전이 학습 (0) | 2024.10.29 |
---|---|
합성곱 신경망 4 - 복잡한 모델 생성 1 : Functional API로 다중 입력, 다중 출력 레이어 생성 및 다중 출력 분류 모델 (0) | 2024.10.29 |
합성곱 신경망 2 - 간단한 모델 생성 1 : 데이터 로드 및 전처리와 Sequential API로 모델 생성 및 학습 (0) | 2024.10.28 |
합성곱 신경망 1 - 합성곱 신경망에 대하여 (2) | 2024.10.28 |
CNN 3 - 개와 고양이를 분류하는 실습 1 : 이미지 파일 분류 (0) | 2024.10.28 |