Doby's Lab

Cat & Dog Binary Classification Project Version 2.1 (FINAL) 본문

AI Projects/Project Description

Cat & Dog Binary Classification Project Version 2.1 (FINAL)

도비(Doby) 2023. 1. 23. 10:00

✔️ Contents

  • Intro
  • Modifications
  • Modeling
  • Outro
  • Postings related Project

✔️ Intro

Version 2를 끝내고 난 후, 공부할 것들을 다 정리하여 공부하는 시간을 갖는 Project After Project의 시간을 가졌었습니다.

공부했었던 내용들은 크게 2가지로 나뉩니다.

  • tensorflow의 ImageDataGenerator
  • Batch Normalization (2015)

위 2가지 내용들을 공부한 후에 기존의 궁금증이 해결되면서 '이 부분을 적용시킨다면 성능이 올라갈 거 같은데'라는 생각이 들었고, 정리한 부분들을 적용하여 Version 2.1의 프로젝트를 진행했습니다.

 

결론적으로, Test Set에서 Accuracy가 기존 87.89%(Version 2)로부터 92.09%(Version 2.1)에 도달했습니다.

 

이번 포스팅에서 변동 사항들에 대해 정리하는 시간을 가져보겠습니다.

📄 Project Github

https://github.com/drawcodeboy/Cat_n_Dog_Classification

 

GitHub - drawcodeboy/Cat_n_Dog_Classification: 고양이와 개를 Binary Classification하는 첫 인공지능 프로젝트입

고양이와 개를 Binary Classification하는 첫 인공지능 프로젝트입니다. Contribute to drawcodeboy/Cat_n_Dog_Classification development by creating an account on GitHub.

github.com

📄 Version 1

https://draw-code-boy.tistory.com/488

 

Dog & Cat Binary Classification Project

✔️ Contents Intro Purpose Tool Step 1: Get Data Step 2: Path to Image Step 3: Modeling Outro ✔️ Intro 12월이 되고 해를 마무리 짓는 시기가 되면서 올해 부족했던 것들을 찾는 시간을 가졌었습니다. 인공지능에 대

draw-code-boy.tistory.com

📄 Version 2

https://draw-code-boy.tistory.com/506

 

Dog & Cat Binary Classification Project Version 2

✔️ Contents Intro Purpose Tool Project Structure Data Preprocessing Modeling (Overfitting) Outro Postings related Project Reference ✔️ Intro 기존의 프로젝트를 끝내고 나서 Version 1은 55.51%라는 성능이 '반은 맞추고, 반은

draw-code-boy.tistory.com


✔️ Modifications

📄 ImageDataGenerator

기존의 Image Augmentation은 3가지의 변형을 주는 코드를 직접 짜며 적용했었습니다.

Version 2를 진행함에 있어서 ImageDataGenerator를 알게 되었지만, Generator라는 생소한 개념이 처음 등장해서 Version 2가 끝난 후에 공부했었습니다.

 

공부한 후에 기존 Image Augmentation보다 더욱 간편하게 여러 증강 기법을 적용할 수 있었고, 기존 증강의 단점들을 모두 보완할 수 있었습니다.

또한, Generator Iterator를 사용함으로써 메모리적인 측면에서도 효율적으로 작업할 수 있어서 RAM에 대한 걱정이 없었습니다.

 

그래서 ImageDataGenerator를 Version 2.1에 적극적으로 차용했습니다.


📄 Batch Normalization (2015)

Version 2에 적용했던 Batch Normalization에 대해 궁금한 것들이 많았습니다.

이 점들을 해결하기 위해서는 직접 논문을 읽어보는 것이 좋겠다 판단하여 읽고 블로그에 정리까지 마쳤습니다.

 

'BN(X)가 먼저냐, Activation이 먼저냐'라는 물음에 논문을 읽어본 결과,

'BN(X)를 한 후에 Activation의 Non-linearity를 잃어버리지 않기 위해서 Scaling Factor, Shift Factor를 넣는다.'라는 말이 있었습니다.

 

그래서 BN(X) -> Activation의 구조의 layers를 만들어 주었습니다.


📄 Remove Dropout

그리고, 이번 모델에서는 2가지 이유에 근거하여 Dropout을 모두 제거했습니다.

(1) Batch Normalization

Batch Normalization의 논문에서 Batch Normalization이 Regularization의 역할을 하기 때문에 Dropout을 줄이거나 없애도 된다는 이야기를 합니다.

(2) Dropout Ansemble with Image Augmentation?

ImageDataGenerator는 랜덤적인 확률 변수에 의해서 여러 기법들을 적용할 것인지 말 것인지 혹은 특정 범위 내에서 랜덤 하게 적용하도록 만들어져 있습니다.

 

그리고, Dropout은 Batch마다 Dropout-rate에 의해 모델이 달라지며, 이는 Ansemble의 효과를 가져옵니다.

 

그런데 여기서 궁금한 게 'Dropout으로 만들어진 여러 모델들이 각기 다른 Dataset을 학습하는 것이 과연 좋을까'라는 생각이 들었고, 좋지 않을 거라 판단하여 이번 모델에서는 Dropout을 모두 빼주었습니다.


✔️ Modeling

# Modeling

# 1st Conv
model = keras.Sequential()
model.add(keras.layers.Conv2D(32, kernel_size=3,  
                              padding = 'same', input_shape=(224, 224, 1),
                              kernel_regularizer=keras.regularizers.l2(0.002)))
model.add(keras.layers.MaxPooling2D(2))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Activation('relu'))
# 2nd Conv
model.add(keras.layers.Conv2D(64, kernel_size=3,
                              padding = 'same', 
                              kernel_regularizer=keras.regularizers.l2(0.002)))
model.add(keras.layers.MaxPooling2D(2))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Activation('relu'))
# 3rd Conv
model.add(keras.layers.Conv2D(128, kernel_size=3,
                              padding = 'same',
                              kernel_regularizer=keras.regularizers.l2(0.002)))
model.add(keras.layers.MaxPooling2D(2))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Activation('relu'))
# Dense
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(512,
                             kernel_regularizer=keras.regularizers.l2(0.002)))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Activation('relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics='accuracy')

early_stopping_cb = keras.callbacks.EarlyStopping(patience=20, verbose=1,
                                                  restore_best_weights=True)

learning_rate_reduction_cb = keras.callbacks.ReduceLROnPlateau(
    monitor='val_accuracy', patience = 10, verbose=1, factor=0.5, min_lr=0.00001,
    cooldown=5
)
from keras.preprocessing.image import ImageDataGenerator

BATCH_SIZE = 64

train_data_generator = ImageDataGenerator(rescale=1./255, 
                                   rotation_range=10,
                                   shear_range =0.7,
                                   width_shift_range=0.2,
                                   height_shift_range=0.2,
                                   validation_split=0.06
                                   )

train_generator = train_data_generator.flow_from_directory(
        '/content/drive/MyDrive/cat_n_dog/training_set/training_set',
        target_size = (224, 224),
        batch_size = BATCH_SIZE,
        class_mode = 'binary',
        color_mode ='grayscale',
        shuffle = True,
        subset='training')

val_generator = train_data_generator.flow_from_directory(
        '/content/drive/MyDrive/cat_n_dog/training_set/training_set',
        target_size = (224, 224),
        batch_size = BATCH_SIZE,
        class_mode = 'binary',
        color_mode ='grayscale',
        shuffle = True,
        subset='validation')

test_data_generator = ImageDataGenerator(rescale=1./255)

test_generator = test_data_generator.flow_from_directory(
        '/content/drive/MyDrive/cat_n_dog/test_set/test_set',
        target_size = (224, 224),
        batch_size = BATCH_SIZE,
        class_mode = 'binary',
        color_mode ='grayscale')
# Training

history = model.fit(train_generator, epochs=200, validation_data=val_generator,
                    steps_per_epoch = 7525//BATCH_SIZE+1, validation_steps = 480//BATCH_SIZE+1,
               callbacks=[early_stopping_cb, learning_rate_reduction_cb])

앞서 위에서 말한 내용들을 전부 적용하면서 추가적으로 Epoch를 50에서 200으로 늘림에 따라 Callback도 patience를 많이 늘려주었습니다.

📄 Training and Validation Accuracy and Loss

아래 그래프를 보면 156번째 Epoch에서 EarlyStopping이 실행되었고, 136번째가 val_loss 값이 제일 낮아서

136번째 Epoch의 모델로 채택하였습니다.

 

또한, 5~60에서 val_loss 튐 현상이 심하게 일어났는데 Regularization이 좀 더 들어갔다면 괜찮았을지 혹은 Learning Rate가 높았나라는 의문이 남습니다.


✔️ Outro

📄 Result

  • Version 1 : Loss = 0.6844, Accuracy = 55.51%
  • Version 2 : Loss = 0.4305, Accuracy = 87.89%
  • Version 2.1 : Loss = 0.2683, Accuracy = 92.09%

📄 END_FINAL_FINAL

이번에 Version 2를 진행하면서 남은 궁금증들 해결하는 공부가 끝난 후에 적용하고 싶은 부분들을 적용하여 성능을 5%나 올렸습니다.

 

더군다나 Version 2에서는 구글에서 임의로 가져온 24장 중 13장만 맞추는 게 많이 아쉬웠었는데

Version 2.1에서는 25장 중 24장을 맞추는 걸 실시간으로 확인했었는데 이때 성취감을 많이 느꼈었습니다.

특히, 귀가 좀 큰 개들을 고양이로 판단하는 경향이 있었는데 이번엔 잘 학습되어 판단을 잘하는 거 같습니다.

 

Cat & Dog Classification Project를 진행하면서 정말 많이 배우고, 공부하고, 성장했습니다.

단순히 기본적인 프로젝트에도 불구하고, 공부할 것들이 Version 1부터 엄청 많았습니다.

Version 1도 만든 지 1달이 넘어가는데 그 사이에 했던 것들을 생각하면 정말 많이 했구나 싶습니다.

 

이제 더 이상의 Cat & Dog 분류 프로젝트는 그만하도록 하고, 다음엔 새로운 주제의 2번째 프로젝트를 진행해보려 합니다.

아마 그 사이에 내실을 튼튼하게 하기 위해 수학 공부를 좀 하다가 프로젝트를 진행할 거 같습니다.

 

첫 프로젝트다 보니 정도 많이 들었었는데 꽤 시간이 많이 지나서 더 성장을 한 후에 Version 3도 고려해 보겠습니다.

 

진짜 끝! 🔥


✔️ Postings related Project

https://draw-code-boy.tistory.com/514

 

tensorflow의 ImageDataGenerator

✅ Contents 1. Intro 2. Generator란 3. ImageDataGenerator 4. flow (flow_from_directory) 5. Code 6. How to Work (Question) 7. Better Training? 8. Outro 9. Reference ✅ 1. Intro 프로젝트를 하면서 Image Augmentation이라는 기술을 접했는데

draw-code-boy.tistory.com

https://draw-code-boy.tistory.com/522

 

Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

✅ Contents Intro Abstract 1. Introduction 2. Towards Reducing Internal Covariate Shift 3. Normalization via Mini-Batch Statistics 4. Experiments & 5. Conclusion (skip) Outro Reference ✅ Intro 📄 Motivation Batch Normalization에 대해 알게 된 후

draw-code-boy.tistory.com

 

728x90