본문 바로가기
machine learning

[TENSORFLOW]CNN-Classification

by 유주원 2017. 5. 11.

2017/05/08 - [machine learning] - [TENSORFLOW] CNN-CONVOLUTION

2017/05/09 - [machine learning] - [TENSORFLOW]CNN-MAXPOOLING

convolution을 통해 각각 다른 관점에서의 이미지를 제공하고, maxpooling을 통해 정보의 차원을 낮춰 계산을 단순하게 했다면, 이제는 이 둘을 연결해서 실제로 이미지를 classification 해보자.

아래의 코드를 살펴보자.

이미지 전처리 함수와 convolution, maxpooling 함수는 이전 포스팅에서 충분히 다루었기 때문에 생략하겠다.

model 함수를 보자.

24x24 input 이미지에 64개의 5x5 마스크들을 필터링 한다. 이렇게 하면 24x24의 이미지가 64개가 생기게 된다. 필터링 후에는 64개의 bias들을 각각의 이미지에 더해주고 활성화함수 relu를 씌운다. 이 후에 커널 사이즈 2x2의 max_pooling을 진행하게 되며, 결과 값으로 12x12의 이미지가 64개가 생긴다. 이렇게 생긴 결과 값에 대해 overfitting을 막고 에러율을 줄이기 위해 tf.nn.lrn을 사용해서  normalization을 실행해준다.

normalization까지 마친 결과 이미지들에 대해 다시 64개의 5x5 마스크들로 필터링을 해 주고 그 결과로 12x12의 이미지 64개를 얻는다. 역시 마찬가지로 bias를 더하고 relu를 씌운다. convolution 결과에 대해 normalization을 해주고, 2x2 maxpooling을 함으로써 64개의 6x6 이미지들을 생성한다.

6x6의 64개의 이미지들은 64개의 관점에서 본 각각의 이미지 특징들을 의미하며 이제 각각의 관점에서 본 이미지 특징들을 하나로 합쳐서 하나의 특징 데이터로 만들어야 한다. 이를 위해 6x6의 64개의 이미지를 1024의 행렬로 만들기 위한 가중치 행렬을 곱하고 bias를 더해서 편차를 더한다. 이렇게 각각의 관점들을 하나로 합치는 것을 fully-connection 이라고 부르며, fully-connection 이후에는 실제 출력 값의 가중치를 계산하기 위해 1024를 10개의 차원(이미지 분류의 수)으로 줄인다. 이렇게 해서 나온 가중치의 값이 제일 큰 결과 값이 해당 이미지의 분류 결과인 것이다.

이렇게 분류 모델의 정의가 끝났다면 이제는 모델을 학습하기 위한 준비를 해야 한다. label에 onehot encoding을 적용함으로써 정답 label을 달아 주자. 그리고 train data의 / 200 만큼을 batch size로 잡아주자. 우리는 train data의 길이만큼 루프를 도는데 한 번에 train data / 200 만큼의 데이터를 가져와서 training을 할 것이다. 이렇게 batch로 하는 이유는 저번에도 설명했듯이 좀 더 빠르게 학습을 완료시키려는데 있다. 모든 train data의 학습이 끝나면 1 epoch가 끝난 것이며, 우리는 총 2000 epoch를 실행시킬 것이다.

batch를 한번씩 돌릴 때마다 accuracy를 측정할 것인데, 여기서는 따로 test set을 설정하지 않았고 그냥 training set의 일부를 가져와서 accuracy를 측정할 것이다. 하나의 epoch가 끝날 때 이렇게 측정된 accuracy의 평균을 구해서 성능 결과로 출력해보자.

epoch가 진행 될수록 accuracy가 점점 1에 가까워지는 것을 확인할 수 있으며, 분류 모델의 정확도가 학습할 수록 점점 좋아지고 있다는 것을 확인해 볼 수가 있다.