CNN으로 동작 학습하기 - code review_ ver1.0

SeomIII·2022년 4월 17일
0

SONSU

목록 보기
5/29

📌 cnn을 활용한 이진분류 (5프레임 당 1장)

코랩으로 진행한 코드_cnn_binary_5f1


1. 텐서플로우, 넘파이, 맷플롯립 등 기본 라이브러리와 함께 케라스로부터 ImageDataGenerator 함수를 불러온다.
2. 구글 드라이브 마운트
3. 훈련셋, 검증셋 위치 지정

  • 케라스 ImageDataGenerator 클래스 함수를 실행하고, rescale 옵션을 지정해 이미지 각 필셀의 값을 0~1 범위로 정규화 한다. 생성된 제너레이터 객체를 image_gen 변수에 할당한다.
  • 이미지 제너레이터 객체에 flow_from_directory 함수를 적용하면, 지정한 폴더에서 이미지를 가져와 반복 이터레이션이 가능하도록 데이터 셋을 처리한다.
    • 훈련 셋이 저장되어 있는 train_dir, batch_size 속성에는 배치를 구성하는 이미지 개수 3
      == 이미지 3장씩 묶어서 하나의 배치를 구성한다.
    • target_size 속성에는 저장될 이미지의 (세로,가로) 픽셀 사이즈 = (224,224)로 리사이징
    • classes 속성에는 클래스 레이블(실제 이미지가 들어있는 하위 폴더 이름인 fine,hello)
    • class_mode에는 이진 분류 문제를 나타내는 binary 모드
    • 랜덤 시드 값
    • ex) fine 폴더에 들어있는 이미지를 (224,224) 크기로 리사이징하고, 클래스 레이블은 'fine'에 해당하는 정수로 레이블 인코딩한다. 이미지를 3장씩 묶어서 하나의 배치를 구성한다.
    • 검증 셋에 대해서도 동일한 방식으로 제너레이터 객체를 만든다.

  • 1개의 배치를 선택해서 배치 안에 들어있는 3개의 이미지를 정답 클래스 레이블과 함께 출력해본다.
  • '배치정규화-합성곱-풀링'으로 구성된 단위블럭을 3개 반복하여 이미지로부터 다양한 피처(특징)를 추출하고, 최종 분류기로는 Dense 레이어를 사용한다. 최종 출력 레이어는 노드 1개를 갖고 활성화 함수로는 'sigmoid'를 적용한다.
  • 옵티마이저, 손실함수를 지정한다.
  • 모델을 컴파일하고, 20 epoch 동안 훈련시킨다.

📝 batch size 가 왜 3인가요?
예시에서는 batch size가 32였는데,데이터 셋의 양이 적어 임의적으로 3이라고 지정했는데, 잘 모르면서 내 마음대로 정한 것 같아 더 알아보는 시간을 가져보았다.

헷갈리는 개념 - epoch? batch size? iteration?

👊 batch size가 너무 작아서 훈련이 불안정해졌나 싶어 기존 예제인 32로 늘려 학습을 다시 진행했다.

  • 그렇게 멋진 변화는 없었다고 한다,,
👊 epoch가 너무 작나 싶어 40으로 늘려 다시 진행했다.

  • 전혀 좋은 방법이 아니었나보다..

#### 📌 cnn을 활용한 다중 분류(5프레임당 1장)

참고
cnn이 동작하지 않는 이유
https://seongkyun.github.io/study/2019/11/21/cnn_problem/

profile
FE Programmer

0개의 댓글