코딩두의 포트폴리오

OSS - 13_ 패션 아이템을 구분하는 DNN 본문

Open Source Software

OSS - 13_ 패션 아이템을 구분하는 DNN

코딩두 2024. 5. 16. 14:48

Fashion MNIST 데이터셋 알아보기

Fashin MNIST

28 x 28 픽셀 70,000개 흑백이미지
신발, 드레스, 가방 등 총 10가지 카테고리

 

torch & torchvision 모듈

 

실습예제

04-패션_아이템을_구분하는_DNN/fashion_mnist.ipynb

과적합 방지

 

입력 이미지를 텐서로 변환하는 코드 설정

 

Fashion MNIST 데이터셋 가져오기

학습용, 성능 평가용으로 구분되어 있음

True - 학습 데이터

Flase - 테스트 데이터

traim 옵션만 다름

 

Fashion MNIST 데이터 일부를 출력해 보기

 

 

개별 이미지 꺼내보기

 

인공신경망으로 패션 아이템 분류하기

실습예제

04-패션_아이템을_구분하는_DNN/neural_network.ipynb

cuda가 설치되어 있는지? = GPU가 설치되어 있는지?

GPU o -> cuda

GPU x -> cpu

 

 

 

첫 런타임 시 CPU가 출력

 

런타임 유형을 GPU로 변경

 

cuda로 변경됨을 확인

 

이미지 분류 문제

 

이미지 분류를 위한 인공신경망 구현

입력 x 는 [배치크기, 색, 높이, 넓이]로 구성
  – x.size()를 해보면 [64, 1, 28, 28]이라고 표시
  – Fashion MNIST에서 이미지의 크기는 28 x 28, 색은 흑백으로 1 가지
입력 x의 총 특성값 갯수는 28 x 28 x 1, 즉 784개
레이어가 3개인 3층 인공신경망 구현

784 - 256 - 128 순으로 연결되면서 10개가 최종 출력

view: 1차원 행렬로 표현

 

학습 데이터가 주어지고, 위에서 정의한 모델 사용

 

성능 측정하기

하이퍼 파라미터(hyper parameter)
  – 신경망 모델 층의 종류와 크기, 배치 크기, 학습률 등 사용자가 직접 지정해주는 값들
일반적인 머신러닝 데이터셋 구분
  – 학습 데이터 : 가중치 조절
  – 검증(확인) 데이터 : 배치 크기와 모델 설계와 같은 하이퍼 파라미터 조절
  – 테스트(시험) 데이터 : 성능 보고
Fashion MNIST 데이터셋은 규모가 작아서 학습과 테스트 데이터로만 구분

 

평가하기 위한 함수 정의

학습을 하는게 아니라서 기울기 계산이 여기서는 필요 X

 

epoch마다 학습과 테스트셋을 이용한 검증을 반복하고 결과를 출력

 

과적합과 드롭아웃

과적합(overfitting)

  • 학습 성능은 좋은데, 테스트셋이나 실제 상황에서 성능이 나쁜 경우
  • 학습 데이터에만 치중되어 유연성이 부족한 상태
  • 새로운 데이터에 대한 성능이 잘 나오지 않는 상태
  • 즉, 예를 들어 원리에 대한 이해 없이 연습문제만 외운 경우

과소적합(underfitting)

  • 학습을 제대로 진행하지 않은 상황
  • 과적합의 반대 상황

일반화(generalization)

  • 학습 데이터와 실제 데이터에서 모두 좋은 성능을 내는 상태
  • 과소적합과 과적합의 중간

 

과적합을 어떻게 알 수 있을까?

  • 데이터셋을 학습, 검증, 테스트셋으로 나누고,
  • 학습하다가 검증 데이터셋에 대한 성능이 나빠지기 시작하기 직전이 가장 적합한 모델

신경망 학습을 할수록 정확률이 더 올라가는 것을 확인

반복할수록 오차가 점점 줄어듦

과적합 되었다고 보기는 어려움

 

과적합 해결방법(1)

데이터 늘리기(data augmentation)

  • 모든 종류의 데이터를 확보하는 것은 불가능하므로,
  • 이미 가진 데이터를 이용하여 일부분을 자르거나, 돌리고, 노이즈를 더하고, 색상을 변경하는 등 유사 데이터를 늘림
  • 예제에서는 오른쪽과 왼쪽을 뒤집는 대칭이동 전략을 적용해보자.

 

과적합 해결방법(2)

드롭아웃(dropout)

  • 학습 진행 과정에서 신경망의 일부를 사용하지 않은 방법
    - 예) 50% 드롭아웃(신경망 중 학습 시 일부분만 사용)은 학습 단계마다 절반의 뉴런만 사용
  • 검증과 테스트 단계에서는 모든 뉴런 사용

 

실습예제

04-패션_아이템을_구분하는_DNN/overfitting_and_regularization.ipynb

 

  • 데이터셋에 노이즈를 추가하거나 모델에 드롭아웃을 적용하면 학습하는데 시간이 많이 걸림
  • 그래서 epoch 수를 늘려서 학습
  • 정확도가 높게 시작해서 꾸준히 증가하는 것을 볼 수 있음

랜덤플림 활용해서 데이터 개수 늘림

 

 

개선된 코드