-
[모두를 위한 딥러닝 시즌2][Lab 11](2) mnist cnn keras sequential/functional/subclassing/ensemble/keras eager모두를 위한 딥러닝 시즌2 2021. 11. 16. 10:46
이런 과정의 CNN으로 실습을 진행해 볼 것이다.
Convolution layer에선 stride를 1로 하고 padding=SAME으로 할 것이다.
Pooling layer에선 stride를 2로 하고 padding=SAME으로 할 것이다.
사용할 라이브러리들이다.
첫 번째로 하이퍼 파라미터들을 설정한다.
그리고 check point를 저장할 디렉터리를 설정해주었다.
네트워크를 만들기 전에 데이터를 수집, 가공 분석하는 과정을 거친다.
이제 본격적으로 네트워크를 만든다.
Sequential API를 사용해서 벽돌을 한 장 한 장 쌓듯이 모델에 하나씩 layer들을 추가해준다.
모델을 다 만들고 나서 summary()를 사용하면 모델에 대한 정보를 볼 수 있다.
모델을 만들었으면 Loss function과 gradient를 구하는 함수를 정의해야 한다.
이 실습에선 Adam Optimizer를 사용할 것이다.
그리고 accuracy를 구하는 함수를 정의해준다.
이제 train과 validate 과정을 진행해준다.
이 모든 과정을 거치면 Dense layer만 가지고 했던 학습보다 훨씬 높은 약 99.4%의 Accuracy를 얻을 수 있다.
이번엔 Sequential API가 아닌 Functional API를 사용해서 모델을 만들어 볼 것이다.
이렇게 Sequential API를 사용하면 굉장히 간단하게 모델을 만들 수 있지만 한계점이 있다.
이런 식으로 구현하지 못하는 모델이 있다는 것이다.
하지만 Functional API를 사용하면 이런 모델들을 구현할 수 있다.
생성하는 layer마다 입력을 명시해주는 것이 Functional API의 특징이다.
이번엔 tf.keras.Model subclassing을 사용해서 모델을 만들어 볼 것이다.
Model subclassing을 사용하면 가장 customize 한 모델을 만들 수 있다.
이렇게 class 형태로 모델을 만들면 여러 개의 모델을 동시에 학습시켜서 나중에 모든 모델을 inference 하는 Ensemble을 사용하기 쉬워진다.
이번엔 Model subclassing으로 모델을 여러개 만들어서 Model Ensemble 기법을 코드로 구현해 볼 것이다.
모델을 3개 만들 것이기 때문에 models 리스트를 만들어서 모델들을 추가해준다.
학습은 따로따로 시킬 것이기 때문에 다른 코드는 동일하게 하되,
accuracy를 구하는 evaluate 함수에서 모델 하나가 아닌 models 리스트를 받도록 고친다.
그리고 리스트의 각 모델들의 logits 값들을 더한 predictions 중에서 가장 큰 것을 accuracy로 리턴하도록 한다.
train 시키는 코드는 for문 안에 for문을 하나 더 넣어서 여러 개의 model을 train 시키도록 한다.
이렇게 Ensemble 기법을 사용하면 Accuracy가 약 0.1% 정도 더 향상된 결과를 볼 수 있다.
모델 구성은 그대로 하되 아래의 기법들을 모두 사용해서 모델의 성능을 높여볼 것이다.
라이브러리를 불러올때 Data Augmentation을 하기 위해, ndimage 라이브러리를 추가로 import 해준다.
하이퍼파라미터들을 동일하게 세팅해주고
Data Pipelinling을 해주기 전에 Data Augmentation을 추가로 해준다.
Data Pipelinling에선 기존 데이터들에 Data Augmentation가 적용된 상태로 진행해준다.
그럼 데이터가 5배로 늘어나기 때문에 buffer size도 5배 늘려준다.
Convolution을 진행하고 Betch normalization을 한 후 ReLU 함수를 적용하는 네트워크를 만든다.
그리고 이번 실습에선 model의 개수를 5개로 만들어서 Model Ensemble을 사용했다.
Loss 함수와 Gradient를 구하는 함수는 동일하게 작성한다.
마지막으로 Train과 Validate을 진행해주면 Accuracy가 99.68%로 나온다.
'모두를 위한 딥러닝 시즌2' 카테고리의 다른 글
[모두를 위한 딥러닝 시즌2][Lab 12](2) RNN TensorFlow (0) 2021.11.17 [모두를 위한 딥러닝 시즌2][Lab 12] RNN (0) 2021.11.17 [모두를 위한 딥러닝 시즌2][Lab 11] Convolution Neural Networks (0) 2021.11.15 [모두를 위한 딥러닝 시즌2][Lab 10] Relu, Weight Initialization, Dropout, Batch Normalization (0) 2021.11.10 [모두를 위한 딥러닝 시즌2][Lab 9] Neural Nets for XOR (0) 2021.11.09