#9 of AI and Deep Learning - 이미지 다중 분류 Multi Classification

이미지 다중 분류 CNN

개요

  • 학습목적
    • 다양한 카테고리의 이미지들을 분류해주는 학습 모델 구현
  • 기본 활용 라이브러리
    • Keras
      • 오픈 소스 신경망 라이브러리
  • 기본 활용 패키지
    • PIL
      • Python Image Library
    • glob
      • 원하는 확장자의 파일 리스트를 뽑아낼 때 활용하는 라이브러리
      • 참고문서
    • scikit-learn
      • train_test_split 함수
        • 훈련 및 테스트 데이터 분리
        • 비율로 설정 ex) 0.3
    • keras.XXXX
      • models
        • Sequential 함수
          • 순차적인 모델 구성을 설정하기 위한 초기화 선언 개념
          • 일종의 학습 모델 객체 선언
        • model.add()
      • layers
        • Conv2D 함수
          • Convolutional Neural Network 의 핵심 사항
          • 주요인자
            • 필터 갯수
            • 커널 (행, 열)
            • padding = 경계 처리 방법 (사이즈)
              • valid = 출력 이미지 < 입력 이미지
              • same = 출력 이미지 > 입력 이미지
            • input_shape = 샘플 수 제외한 입력 정의
              • 첫 레이어만 설정
              • (행, 열, 채널)
                • 흑백 = 채널 1
                • RGB = 채널 3
        • Maxpooling2D 함수
          • 출력 데이터의 크기를 줄이거나 특정 데이터 강조 역할
        • Dense 함수
          • FC (Fully Connected / 전결합 레이어) 레이어와 동의어
          • 전결합 레이어의 문제점
            • 전결합 레이어는 1차원 데이터만 입력받을 수 있음
            • 이미지 파일은 지정된 채널에 따라 3차원 형태임
              • 즉, 이미지가 가진 고유한 공간 정보가 소실 됨
Dense Layer (FC Layer) 의 CNN 모델에서의 문제점

        • Flatten 함수
          • Conv2D - Maxpooling 과정을 반복하다보면 2차원이 됨
          • 마지막 출력은 1차원으로 도출되어야 하므로 FC Layer 활용
          • 이 과정에서 2차원 -> 1차원으로 변환해주는 역할
        • Dropout 함수
          • layer 의 일부노드 삭제
          • 삭제된 노드는 학습에 영향을 주지 않음
          • 사용이유
            • 1) 복잡하고 깊은 망을 학습하는 데 리소스 투입 과다
            • 2) 그럴수록 결과 응답 시간 느림
            • 위 2개의 문제를 해결하기 위해 사용
          • 추가장점
            • 랜덤으로 생략된 노드 = 다양한 모델을 도출하는 것
            • 일종의 앙상블 효과
2x2 크기 필터 (=가중치 w) 1개를 사용하여 입력 - 출력 도식화한 그림

대략적인 학습 순서

  • 패키지 선언
  • 분류할 카테고리 지정
    • nb_classes
  • 호출할 이미지 파일 정제
    • 가로, 세로 크기 지정 ex) 64x64
    • 채널 지정 ex) 64x64x3 (3 채널 = RGB)
  • 저장된 이미지 호출
    • 이미지 수급 방법
    • 카테고리 수만큼 루프 돌면서 X, Y raw dataset 생성
      • 불러들인 모든 이미지 -> 지정된 크기로 resize
      • np.asarray 로 벡터 배열 변경
      • X.append
      • Y.append
        • one hot encoding
        • ex) 5개 카테고리일 경우
          • [1, 0, 0, 0, 0]
          • [0, 1, 0, 0, 0]
      • 정리하자면, 카테고리 (=디렉토리 수) 및 이미지 갯수만큼 루프 돌면서
        • 이중 for 문
          • resize 된 이미지 1개당 (X)
          • one hot encoding 된 레이블 1개 매칭 (Y)
        • ex) "빈티지" 디렉토리에서 가져온 이미지의 경우
          • 호출
          • resize -> 앞서 언급한바와 같이 width, height 재조정
          • "빈티지" idx 에 맞춰 one hot encoding
            • 5개 카테고리 중, 3번째가 "빈티지" 라면
            • [0, 0, 0, 1, 0, 0] (0번째 idx 는 디폴트)
    • 배열 -> 벡터
      • by np.array
    • 중간 중간 변환된 데이터 확인
    • 본격적인 학습 시작
      • 모델 준비
        • model.Sequential
        • model.add
          • 학습에 필요한 레이어 선별
            • 위 개요에서 언급한 여러 레이어
        • 마지막 출력은 본인이 원하는 목적에 맞춰 1개 or 확률적 결과 도출
          • 목적에 맞는 activation function 설정
        • model.compile
          • loss 함수 설정
            • 위에서 언급한 마지막 출력 결과에 대한 손실 계산
            • 다중 분류의 경우 categorical crossentropy 적용
            • optimizer
              • adam = 가장 보편적인 경사 하강법
    • modelcheckpoint
      • 학습을 반복 진행하면서 중간결과 통보
        • 인자 설명
          • verbose = 진행 상황 출력 여부
          • save_best_only = 더 나은 모델만 저장
      • 지정된 디렉토리 path 에 epoch 및 오차율 저장
    • early stopping 설정
      • 학습 효율이 더 이상 향상되지 않을 때 조기 종료하는 설정
    • model.fit
      • 학습 시작
      • 학습 결과를 history 함수를 통해 그래프로 확인 가능
        • val_loss = 검증 손실값
        • loss = 훈련 손실값


References



댓글