멋사 AISCOOL 7기 Python/TIL

[TIL]1207: cnn, ILSVR우승 알고리즘, 전이학습

dundunee 2022. 12. 14. 02:05

오늘의 목표 소개

1003 => 전이학습(trasfer learning) => 기존 유명한 논문의 CNN 모델이 이미 TF, keras, PyTorch 등에 구현이 되어있습니다. 그래서 해당 모델을 직접 구현하지 않고 가져다 쓸 수 있는게 전이학습입니다. 여기에서 미세조정 등을 해주게 되면 직접 모델을 구현했을 때에 비해 거인의 어깨 위에 올라가서 사용하기 때문에 조금 더 나은 성능을 내기도 합니다.

1004실습

날씨이미지 분류(TF, keras 의 이미지 전처리 기능을 사용하지 않고 넘파이로 직접 이미지 array를 만들어 봅니다. 다차원 배열을 만들어 CNN에 적용하는 실습이 목적이다.

CNN 복습

스트라이드를 통해 여러 칸을 이동하면 결과가 어떻게 될까요?

  • 용량이 줄어들고, 학습속도가 빠르다. 하지만 자세히 학습하지 못하기때문에 언더피팅이 될 수 있다.
  • 출력의 크기가 작아진다.

이미지 증강을 할 때 주의해야 할 사항이 있다면?

  • 크롭이나 확대-> 노이즈를 확대하거나 크롭하면 더 문제가 될 수 있다.
  • 회전, 반전-> 6, 9와같이 돌리면 완전히 다른 의미가 되는 숫자는 돌리지 않는다.
  • 색상변경 -> 색상이 중요한 역할을 하는 이미지일 경우에 색상 반전 혹은 변경을 하면 안된다(신호등, 과일등)
  • 증강을 할 때는 현실세계문제와 연관해서 고민해봐야 한다.
  • (쭈의!)증강할 때 train에만 해준다. test에는 해주지 않는다. : 왜냐하면 현실세계 문제를 푼다고 가정했을 때 현실세계 이미지가 들어왔을 때 증강해주지는 않고 들어온 이미지로 판단하기 때문에 trin에만 사용한다.

ILSVRC우승알고리즘

목적: CNN 우승 알고리즘 아키텍처에 대한 기본적인 이해를 하고 전이학습(Transfer Learning)에 적용하기 위해 CNN의 역사에 대해 알아보는 것! 전이학습(Transfer Learning): 우승알고리즘을 코드 한 두줄로 가져다 사용할 수 있습니다! 이름만 불러서 사용할 수 있다!

  • VGGNet: 3 * 3 kernel을 사용하면 baseline은 된다!

CNN모델을 학습시키는데 메모리 오류가 났다면?

  • 이미지 사이즈를 줄인다.
  • 레이어를 줄인다. 필터수를 줄인다.
  • 배치(한번에 다 불러오지 않고 나눠서 불러오게)사이즈를 불인다

1003실습

전이학습(Transfer Learning)해보기! : 하나의 문제에서 학습된 기능을 가져와 유사한 새 문제에 활용하는 것으로 구성된다 : pre-trained된 모델을 가져다 사용하는 것

[Module] tf.keras.applications

  • https://www.tensorflow.org/api_docs/python/tf/keras/applications
  • Keras Applications are premade architectures with pre-trained weights.
  • 미리 유명한 모델 아키텍쳐로 학습을 해서 찾아놓은 가중치를 사용한다.
  • 간단하게 보면 유명한 모델 아키텍쳐를 가져다 사용하는 것이다.
  • 논문을 보면 코드가 많고 복잡한데 간단하게 api를 만들어서 코드1-2줄로 사용하게 만들어 놓은 것이다.

VGG16 API: https://www.tensorflow.org/api_docs/python/tf/keras/applications/vgg16/VGG16 tf.keras.applications.vgg16.VGG16( include_top=True, # 네트워크 상단의 3개의 Fullly connected network을 포함할지여부 weights='imagenet', input_tensor=None, input_shape=None, pooling=None, classes=1000, classifier_activation='softmax' )

  • 이미지넷 데이터셋 기준 => 1000 개의 분류를 하는 예제
  • classes=1000 예측할 이미지의 종류가 1000개다.
  • classifier_activation='softmax' 출력층의 output
  • 1000 개 종류의 확률값을 반환다.
  • include_top=False라 하면 상단에 다른 층을 넣지 않겠다의 의미
  • input_shape = train_image[0].shape, 각 image의 shape를 출력했을때의 값과 동일하게 만들어줘야 한다.

1004 실습

[목적] 이미지 파일을 array로 직접 만들어 보기, CNN 네트워크 구성 응용

  • tf.keras의 전처리 기능을 사용하지 않고, 데이터셋도 train, valid, test로 직접 나눠보고자 한다.
  1. label별로 각 폴더의 파일의 목록을 읽어온다
  2. 이미지와 label 리시트를 만들어서 넣어준다.
  3. test는 폴더가 따로 있기 때문에 이미지를 불러올 때 test여부를 체크해서 train, test를 먼저 만든다
  4. np.array 형태로 변환해 주었습니다.
  5. train 으로 train, valid 를 나누어 줍니다.
  6. train, valid, test 를 만들어 줍니다

이미지데이터 셋 만들기

이미지 사이즈 변경: 사이즈가 다르면 합성곱연산을 할 수 없기 때문에 같은 사이즈로 조절해 줄 필요가 있다. def img_read_resize(img_path): img = cv2.imread(img_path) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.resize(img, (120, 120)) return img 이미지 가져오는 함수 만들기 train, test나누기

  • 어떤 기준으로 train과 test를 나눠줄까? 파일에 test파일이 있으므로 이를 제외한 나머지는 train으로 처리한다.
  • append와 extend의 차이? append는 통째로 넣고, extend는 풀어서 넣는다.

이미지데이터 정규화

왜 255로 나눠주는가?

  • RGB 3원색은 0-255값을 갖는다. 그래서 [0, 1]범위를 만들어주기 위해 255로 나눠준다.
  • RGB형태의 컬러 디스플레이 방법은 가산혼합방법으로 다 합치면 흰색이 된다.
  • CMYK형태의 인쇄 방법은 감사혼합으로 다 합치면 검은색이 된다.
  • RGB는 0~255로 3개의 R, G, B 빨초파 로 표현하게 된다.

!복잡한 코드를 작성하는 팁!

  • 복잡한 문제들이 대체적으로 어렵게 느껴지기때문에 코드를 수도코드로 작성하는것도 하나의 팁
  • 현업을 할 때도 업무가 복잡하기 때문에 과정을 이해하는 것이 중요하다.
  • 따라서 작은 단위로 나눠서 푸는 것을 추천한다.