티스토리 뷰
3. Convolutional Networks / L2. Convolutional Neural Networks - CNNs in Keras : Practical Example
chrisysl 2018. 9. 12. 17:30CNNs in Keras : Practical Example
- CIFAR10은 6만개의 이미지를 갖고있는 유명한 데이터셋이다.
- 이 데이터셋을 이용해서 이미지 분류를 해보자.
<MLP model>
1. Load CIFAR-10 Database
- 위와같이 로드 해주면 됨. 상대적으로 쉽게 불러올 수 있는편이다.
- 파이썬 모듈 하나만 임포트해주면 되고, 한줄의 코드만으로 모듈을 학습시키고 테스트할 수 있다.
2. Visualize the first 24 training images
- 학습시킬 이미지에 대한 subset을 시각화하여 확인할 수 있다.
3. Rescale the images by dividing every pixel in every image by 255
- 이전에 모든 이미지의 픽셀을 255로 나눠줬었는데, 이번에도 동일하다.
- 0~1 사이의 값으로 정규화 시키기 위함이다.
4. Break dataset into Training, Testing, and Validation sets
- Training, Testing, Validation 이렇게 세가지의 묶음으로 나누기위해 위와같이 작성해준다.
- Training set : 45000 / Testing set : 10000 / Validation set : 5000 으로 나눈다.
- 즉, Training과 Validation set 에서 5만개를 사용하여 네트워크를 학습시키고
- 나머지 만개를 Testing set을 사용해서 정확도를 테스트한다.
- 각 이미지들은 32x32 크기이기 때문에 매우 작은편이다.
- 또한 모두 컬러이미지이기 때문에 컴퓨터에 의해 3D 배열로 인지된다.
5. Define the model architecture
- 가장먼저 학습시켜볼 모델은 "regular vanilla neural network" 이다.
- 먼저 3D 이미지를 flatten 시켜서 벡터로 변환해줘야하고, 그렇게 되면 공간적 정보를 잃게됨.
- 그리고 2개의 hidden layer가 있는 MLP의 input으로 이 값들을 넘겨준다.
- 우측 파라미터의 수를 보면 3억5천만이 넘는다.
- 무작위로 추측했을 경우 대략 10%의 정확도가 나온다.(object의 종류가 10가지이기 때문)
6. Compile the model
- 전과 동일하게 loss function과 optimizer를 사용하고
7. Train the model
- 그리고 모델을 20 epoch 로 학습시키며 최상의 validation accuracy를 뽑아내는 가중치를 저장한다.
8. Load the model with the best classification accuracy on the validation set
- 학습이 종료되면 저장된 가중치를 불러올 수 있다.
9. Calculate classification accuracy on test set
- 불러온 가중치를 바탕으로 test set에 모델을 돌려보면 대략 40%의 정확도를 얻어낼 수 있다.
- 이것은 무작위로 때려맞추는 10%의 확률보단 높지만, CNN을 사용하면 더 나은 결과를 얻어낼 수 있다.
<CNN model>
5. Define the model architecture
- 앞의 import 나 전처리 과정은 동일하므로 생략.
- 앞선 모델 아키텍쳐 설계파트부터 수정해 CNN 모델로 변환해주자.
- input 이미지는 콘볼루션 레이어와 max pooling 레이어가 연속된 구조를 통과하며 공간적 정보를 제거한다.
- 그 후 그 결과를 flatten해서 locally connected 되는게 아닌 fully connected 되는 레이어를 두개 더해준다.
- 이 사이에 dropout 레이어가 추가되어 함께 더해지는데, over-fitting을 최소화 하기 위해서이다.
- 주목할점은 이 네트워크가 MLP보다 훨씬 더 적은수의 파라미터만을 사용한다는 것이다.
- 하지만 이미지를 분류해내는 성능은 더 강력하다.
6. Compile the model
- 같은 loss function과 optimizer를 사용하여 모델을 컴파일해보자.
7. Train the model
- batch의 크기를 32로 두고 100 epoch 돌며 모델을 학습시키자.
8. Load the model with the best classification accuracy on the validation set
- 최상의 유효성 정확도를 얻어내는 가중치를 불러오고
9. Calculate classification accuracy on test set
- 정확도를 테스트 해 보면 대략 66%의 정확도를 보인다.
- MLP보다 정확도가 훨씬 개선된 것을 확인할 수 있으며,
- 이 모델에 추가적으로 CNN을 조정하여 개선되고 최적화 할 여지가 충분히 존재한다.
- CIFAR-10 데이터셋을 이용하여 데이터 과학자들간에 이 이미지분류의 정확도를 높히는 컴피티션을 벌였었는데
- 최종적으로 95%까지 끌어올릴 수 있었고, GPU로 90시간 넘게 학습을 시켰다. 관련자료
- 여러 파라미터들을 조작하며 정확도를 끌어올려보도록 하자.
- 최종적으로 학습된 CNN모델이 예측한 이미지분류. 초록 : correct / 빨강 : wrong