융무의 기술블로그
article thumbnail

#mnist

- convolution을 쓰려면 reshape을 해야 하기 때문에 train과 test를 split 한 다음에 크기를 맞춰주었고 픽셀 값을 0~1사이로 정규화 하기 위해서 255로 나누어 주었다.

- Sequential 모델을 만들어서 컨볼루셔널과 최대 풀링을 위한 MaxPool2D를 하였다.

- 첫번째 CNN 네트워크 구조는 3*3 크기의 필터를 32개 가지는 것이고 여기서 padding 매개변수는 따로 지정해 주지 않았다.(주로 valid 패딩 아니면 same 패딩을 지정한다) 스타라이드 또한 지정해주지 않았다.

- 활성화 함수는 relu 활성화 함수를 선택했고 최근 이미지 분야에서 자주 사용되고 있다.

- 모델에 추가되는 첫 번째 층이므로 입력 크기를 input_shape 매개변수에 지정해 주었다.

- 풀링 층의 첫 번째 매개변수는 풀링 크기로 2*2를 지정해 주었고 두 번째 매개변수는 strides 인데 여기서는 지정해주지 않아서 기본값이다. (2,2) 크기로 풀링했기 때문에 풀링층을 통과한 특성 맵의 크기는 높이와 너비가 절반으로 줄어든다. 하지만 특성 맵의 개수는 변화가 없다.

 

- 완전 연결 층인 Dense 층에 연결하기 위해서는 먼저 3*3*64 차원의 텐서를 일렬로 펼쳐야 하기 때문에 Flattne을 사용하였다.

- 576차원의 텐서가 되고 이를 576개의 유닛을 가진 완전 연결층에 연결하기 위해 Dense 층을 사용하였고 활성화 함수는 렐루함수를 사용하였다.

- 마지막 층은 열 개의 손글씨 숫자에 대한 확률을 출력해야 하므로 10개의 유닛을 가진 완전 연결층이다.다중 분류 문제를 위한 활성화 함수는 소프트맥스함수 이므로 activation 매개변수를 softmax로 지정하였다. 

- 한 눈에 보기 위해서 다시 모델을 summary하였다.

- 다중 분류 작업이므로 손실 함수는 sparse_categorical_crossentropy를 사용했고 옵티마이저는 adam을 사용한 후에 컴파일 하였다. 정확도는 98%까지 나왔다.

- 출력된 결과를 보면 9번째 숫자는 사람이 봐도 5라는것을 알아보기 힘들지만 이 모델의 성능이 매우 뛰어나는것을 알 수있다.

- 첫 번째 합성곱 층의 출력을 이미지로 시각화해 보았다. 첫 번째 배치 차원은 10이고 합성곱을 통과하면 높이와 너비가 각각 26*26으로 줄고 첫 번째 합성곱 층의 필터가 32개이므로 마지막 차원이 32개가 된다.

- 10개의 샘플 중 첫 번째 샘플의 피처 맵 32개를 모두 그려보았다.

- 숫자 7의 윤곽을 특성으로 잘 추출했다.

- 4번째 샘플의 피처 맵을 보았는데 피처 맵마다 조금씩 다른 숫자 0의 윤곽을 추출하고 있다. 피처 맵의 차이는 필터가 서로 다른 부분을 학습하기 때문이다.

- 첫 번째 층의 필터를 출력해 보았다. 필터의 차원은 높이 너비 입력 채널 출력채널 이다.

- imshow 함수는 grayscale 이미지일 경우 (높이,너비)로 컬러 이미지일 경우 (높이,너비,3)인 배열을 기대한다. mnist는 grayscale 이미지 이므로 이 필터의 입력 채널은 한개이다. 입력 채널의 인덱스를 0으로 고정하고 마지막 출력 채널을 순회하면서 필터를 그려보았다.

- 필터의 밝은 부분이 높은 값을 의미한다.

- 합성곱의 활성화 출력과 필터를 분석하면 중요한 통찰을 얻을 수 있다고 하는 경우가 많다는데 더 공부를 해야할거같고 층이 깊어질수록 합성곱의 활성화 출력 의미를 이해하기 어렵다고 한다.

- tensorflow.keras.layers.Conv2D 와 tensorflow.keras.layers.Dense 클래스를 사용하여 합성곱 층과 완전 연결 층을 연결한 합성곱 신경망을 만들어보았다. 조금더 공부를 해서 다양한 이미지 데이터를 가지고 모델을 만들어보고 모델링을 해보는 연습을 해보자.

 

#콜백

- 모델을 훈련할 때 최선의 가중치를 저장하기 위해 ModelCheckpoint 콜백을 사용해도 되는데 여기서는 사용하지 않았고 텐서보드를 사용하여 시각화하기 위해 TensorBoard 콜백도 있는데 여기서는 사용하지 않았다.

- 코드는 이걸 참고하면 된다

- 체크포인트 콜백은 val_loss를 모니터링하고 최상의 가중치를 checkpoint.h5 파일에 저장한다.

- 텐서보드 콜백은 logs 디렉터리 하위에 서브디렉터리를 만들어 통계를 저장한다.

 

- 또한 모델을 fit 시켜서 훈련된 모델을 사용해서 테스트 세트를 평가하기 전에 모델과 가중치를 저장하여 복원할 수도 있다. 이러면 재학습시킬때 시간을 단축시킬수 있다.

 

-머신러닝교과서 with 파이썬, 사이킷런,텐서플로(세바스찬 라시카)를 참고하였다.

profile

융무의 기술블로그

@융무

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!