안녕하세요! 지난 블로그 글에서 Crested Gecko(크레스티드 게코)의 성별을 구분하는 딥러닝 모델 개발 과정을 소개하며, CNN을 활용한 초기 모델 설계와 데이터 증강, L2 정규화를 통해 손실을 줄이는 과정을 다뤘습니다. 당시 모델의 정확도는 약 70%에 근접했고, 손실은 L2 정규화로 2.0대까지 낮췄지만, 학습 데이터 부족으로 인해 과소적합(underfitting)이 의심되는 상황이었습니다. 이번 글에서는 데이터 추가와 모델 세부 조정, 그리고 몇 가지 개선 방법을 통해 정확도를 91%까지 끌어올린 과정을 공유하려고 합니다.
1. 개선 과정 개요
이전 모델의 한계를 극복하기 위해 다음과 같은 접근법을 적용했습니다:
- 학습 데이터 증가: 데이터 부족 문제를 해결하기 위해 더 많은 사진 데이터를 수집했습니다.
- 모델 아키텍처 조정: CNN 구조를 더 깊고 효율적으로 설계하여 특징 추출 능력을 강화했습니다.
- 하이퍼파라미터 튜닝: 학습률과 배치 크기를 조정하여 모델의 학습 안정성을 높였습니다.
- 드롭아웃(Dropout) 추가: 과적합을 방지하고 일반화 성능을 개선했습니다.
- 전이 학습(Transfer Learning) 도입: 사전 학습된 모델을 활용해 성능을 극대화했습니다.
이제 각 단계를 자세히 살펴보겠습니다.
2. 학습 데이터 증가
가장 먼저着手한 것은 데이터셋의 양을 늘리는 작업이었습니다. 기존 디렉토리에 저장된 데이터는 약 80장 정도로, 모델이 다양한 패턴을 학습하기에는 부족했습니다. 크레스티드 게코의 성별 특성이 포함된 사진을 추가로 수집하여 총 200장까지 확보했습니다. 데이터 증강은 여전히 적용하되, 실제 데이터의 양을 늘린 것이 모델 성능에 큰 영향을 미쳤습니다.
3. 모델 아키텍처 조정
기존 모델은 세 개의 합성곱층(Conv2D)과 풀링층(MaxPooling2D)으로 구성되어 있었지만, 데이터가 늘어난 만큼 더 깊은 네트워크를 통해 복잡한 특징을 추출할 수 있도록 설계를 변경했습니다. 추가로 BatchNormalization을 삽입하여 학습 과정의 안정성을 높였습니다.
layers.InputLayer(input_shape=(224, 224, 3)),
# 첫 번째 블록
layers.Conv2D(32, (3, 3), activation='relu', kernel_regularizer=regularizers.L2(0.001)),
layers.BatchNormalization(),
layers.MaxPooling2D((2, 2)),
# 두 번째 블록
layers.Conv2D(64, (3, 3), activation='relu', kernel_regularizer=regularizers.L2(0.001)),
layers.BatchNormalization(),
layers.MaxPooling2D((2, 2)),
# 세 번째 블록
layers.Conv2D(128, (3, 3), activation='relu', kernel_regularizer=regularizers.L2(0.001)),
layers.BatchNormalization(),
layers.MaxPooling2D((2, 2)),
# 네 번째 블록 추가
layers.Conv2D(256, (3, 3), activation='relu', kernel_regularizer=regularizers.L2(0.001)),
layers.BatchNormalization(),
layers.MaxPooling2D((2, 2)),
# 평탄화 및 완전 연결층
layers.Flatten(),
layers.Dense(256, activation='relu', kernel_regularizer=regularizers.L2(0.001)),
layers.Dropout(0.5), # 드롭아웃 추가
layers.Dense(1, activation='sigmoid', kernel_regularizer=regularizers.L2(0.001))
], name="GeckoGenderAI_v2")
4. 드롭아웃 추가
과적합 방지를 위해 완전 연결층(Dense) 직전에 드롭아웃(Dropout)을 추가했습니다. 드롭아웃은 학습 중 일부 뉴런을 무작위로 비활성화하여 모델이 특정 패턴에 지나치게 의존하지 않도록 합니다. Dropout(0.5)는 50%의 뉴런을 비활성화한다는 뜻으로, 실험 결과 이 값이 적절한 균형을 유지했습니다.
5. 하이퍼파라미터 튜닝
Adam 옵티마이저의 학습률을 기본값(0.001)에서 0.0001로 낮춰 모델이 더 천천히, 안정적으로 수렴하도록 했습니다. 또한, 배치 크기를 32에서 64로 늘려 GPU 활용 효율성을 높였습니다.
optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
loss='binary_crossentropy',
metrics=['accuracy']
)
6. 전이 학습 도입
base_model = tf.keras.applications.MobileNetV2(input_shape=(224, 224, 3),
include_top=False,
weights='imagenet')
base_model.trainable = False # 사전 학습된 가중치 고정
model = models.Sequential([
base_model,
layers.GlobalAveragePooling2D(),
layers.Dense(128, activation='relu'),
layers.Dropout(0.5),
layers.Dense(1, activation='sigmoid')
])
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
loss='binary_crossentropy',
metrics=['accuracy']
)
7. 학습 및 결과
위 과정을 적용한 후, 20 에포크 동안 학습을 진행했습니다. 결과는 다음과 같습니다:
- 정확도: 검증 데이터셋에서 91% 달성
- 손실: 약 0.8

8. 학습 결과 시각화
정확도와 손실 그래프를 통해 모델의 개선을 확인했습니다. 초기 에포크에서 검증 정확도가 빠르게 상승하며, 10 에포크 이후 안정적으로 90% 이상을 유지했습니다.
결론
이번 프로젝트를 통해 학습 데이터 증가, 모델 구조 조정, 드롭아웃 추가, 하이퍼파라미터 튜닝, 그리고 전이 학습이라는 다섯 가지 개선 방법을 적용하여 정확도를 70%에서 91%까지 끌어올렸습니다. 특히 데이터 부족 문제를 해결한 것이 큰 전환점이 되었으며, 전이 학습은 적은 데이터로도 높은 성능을 낼 수 있는 효율적인 방법임을 다시금 확인했습니다. 앞으로는 더 다양한 각도와 조명 조건의 데이터를 추가해 모델을 더욱 견고하게 만들 계획입니다.
이 글이 딥러닝 모델 개선에 관심 있는 분들에게 도움이 되었길 바랍니다. 질문이나 피드백이 있다면 언제든 댓글로 남겨주세요!
'Python > AI' 카테고리의 다른 글
[GGA] CNN ,L2 정규화 활용하여 학습 시키는 과정 정리 (0) | 2025.01.23 |
---|---|
[GGA] 데이터 수집 및 개발 환경 -VScode(파이썬 적용 및 이전 버전 설치) (0) | 2025.01.22 |
[GeckoGenderAI] 프로젝트 구상 및 시작하기. (0) | 2025.01.09 |
댓글