내가 하고싶은 건 다 하는 공간

혼자 만들면서 공부하는 딥러닝 3-3 전이학습 | 전이 학습으로 피스타치오 이미지 분류하기 본문

인공지능

혼자 만들면서 공부하는 딥러닝 3-3 전이학습 | 전이 학습으로 피스타치오 이미지 분류하기

하고파 2025. 8. 10. 23:48

서론

이번 글에서는 전이학습에 대해 알아보고자 해요. 전이학습의 필요성부터 전이학습을 통한 피스타치오 이미지 분류까지 알아보고자 합니다.

 

전이 학습

사전 훈련된 신경망의 큰 틀은 유지하면서 최상위 일부 층만 다시 훈련하는 방식이에요. 이는 특정 모델을 이용하고 싶은데 이용하고자 하는 케이스가 사전 훈련에 없을 때 사용할 수 있어요. 예를 들어서 EfficientNet 모델을 이용해서 피스타치오 이미지를 분류하고 싶은데, EfficientNet 모델은 학습할 때 피스타치오 이미지를 사용하지 않았을 때 사용할 수 있죠.

 

사전 훈련된 모델로 피스타치오 품종 분류하기

이를 위해서 캐글에 공개된 피스타치오 이미지 데이터셋을 이용해줍니다. 이를 이용해서 2가지 품종을 분류하는 작업을 수행할 예정입니다.

이 코드를 통해 크기는 (600, 600, 3)임을 알 수 있습니다. EfficientNetB7 모델의 입력 크기와 같은 관계로 이 모델을 사용해서 예측을 수행해보았습니다.

그러나 역시 사전 훈련 데이터셋에 피스타치오가 없는 관계로 엉뚱한 예측을 하고 있습니다. 이러한 한계점을 극복하고자 전이 학습이 필요합니다. 기존 EfficientNetB7의 특성 맵은 그대로 사용하면서, 모델 분류를 담당하는 마지막 층을 손봐줍니다.

그대로 유지되는 부분

  • EfficientNetB7의 큰 틀, 특성맵

전이 학습으로 변경되는 부분

  • 마지막 역잔차 블록 이후 합성곱층부터 밀집층을 삭제
  • 삭제한 위치에 새로운 밀집층을 추가

 

전이 학습으로 피스타치오 품종 분류하기

EfficientNet의 베이스 모델만 사용하고자 include_top = False로 매개변수를 지정해줍니다. 또한 특성맵은 피스타치오 샘플 이미지의 데이터 특성 맵을 이용합니다.

피스타치오 이미지를 로드해줍니다. 그리고 train set과 val set으로 나눠줍니다.

모델을 만들어 훈련할 때 가중치가 같이 변경되면 사전 훈련된 특성을 제대로 활용하지 못하므로 속성을 False로 변경해주고, 베이스 모델에 1)전역 평균 풀링층과 2) 밀집층 두 개를 추가해서 전이 학습된 모델을 만들어줍니다.

RMSprop 옵티마이저와 binary_crossentropy 손실 함수를 사용하고, 20번의 에포크 동안 모델을 훈련합니다.

결과를 시각화하면 이렇게 나옵니다. 에포크 횟수가 증가할수록 손실이 감소하고 정확도가 높아지고 있습니다.