데이터 취업 스쿨 스터디 노트 -(73) 식물의 사진으로 질병 유무 판단(+전이학습), 꽃이름 맞추기

테리·2024년 9월 19일
0

식물잎의 사진으로 질병분류

pytorch로 진행한 코드는 pdf 참조

전이학습 - 식물싶의 사진으로 질병분류(pytorch 버전)

전이학습: 1000개의 사물을 구분할 줄 아는 학습된 모델(ImageNet)의 가중치를 가져와서 우리가 해결하려는 문제에 맞게 보정해서 사용하는 것.

모델 불러오기

Normalize는 R, G, B 색상값을 0~1 사이의 값으로 했을때 그 평균값과 표준편차. 앞에 있는 것이 평균, 뒤에가 표준편차. 색상분포 히스토그램을 찾아서 적어야함. 컬러 사진일 경우 사진에 대한 학습 능력이 올라감.

  • resnet50 이라는 모델을 불러옴.
  • pretrained=True: 학습이 완료된 모델을 가져옴. False이면 구조만 가져옴.
  • in_features: 마지막 레이어에 해당하는 채널 숫자.
    - 이미 완료된 모델의 클래스 수와 내가 가지고 있는 데이터의 클래스 수가 틀릴 경우가 많다. 여기서 우리가 가지고 있는 클래스의 수는 33개.
    - 그래서 불러온 resnet50 모델에서 마지막 fully connected layer를 바꿔줄 필요가 있음.
  • 모델이 원래 가지고 있던 전체 weight를 다 사용할 수 있지만 내가 마지막에 교체한 fully connected layer 33개는 weight가 학습이 안되어 있다. 그러므로 lambda 부분의 옵션을 넣어줘야 한다.
  • lr_scheduler: epoch마다 러닝레이트를 조정함.
    step_size=7, gamma=0.1 이면 7 epoch마다 0.1씩 러닝레이트를 감소시킴.

모델 수정 후 학습시키기

  • resnet.children(): resnet 모델에 속해있는 하위 레이어
    resnet은 10개의 레어이가 있음.
  • for문은 0부터 5까지의 레이어를 학습하지 않겠다

inputs.size(0): batch_size임

전이학습 평가하기

텐서플로우 전이학습

텐서플로우 공식 홈페이지 코드 사용.

  • image픽셀값이 0~255인데 절반인 127.5로 나누고 -1을 하니까 -1~1 사이의 값으로 스케일링 한 것이다.
  • 참고로 28x28은 픽셀의 수를 의미하는 것. 28x28개의 픽셀을 갖고 있는 것이고 그 하나의 픽셀의 값의 범위는 각각 0~255인 것이다.

include_top = False : top은 출력단을 의미함.(보통 아래에서 위로 기술함) 출력은 빼고 가져옴. 이후 별도의 분류기를 얹어(예: 개와 고양이를 나눔) 맞춤형으로 사용하기 위함.
weights='imagenet' : imageNet 데이터셋으로 학습된 사전 학습된 가중치를 사용.

  • 5, 5는 가로세로 크기
  • 1280은 채널의 숫자(텐서플로우는 채널이 맨 뒤에있고 pytorch는 맨 앞에 있음)

베이스 모델 학습은 막음

global average pooling layer: 채널마다의 평균값을 뽑아냄.

이번에는 베이스 모델을 전부 학습시킴

100번째 층까지는 튜닝 안하도록 설정.

  • 위에서 학습시킨 history 사용.
    위에서 epoch를 10으로 잡고 10번 학습함. 그 뒤에 이어서 학습시킴.
  • initial_epoch = history.epoch[-1]: 이전에 학습한 history 객체에서 마지막 에포크 번호를 가져와서, 이 값을 새로운 학습의 시작점으로 설정함.
  • 상단에 있는 initial_epoch와 model.fit() 안에 있는 initial_epoch는 다른 변수임.

꽃이름 맞추기

라벨을 저장하는 파일이 따로 있음

꽃 사진 분류
'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz'

성능이 썩 좋은건 아니다.

"https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/2"

맨 마지막 단은 나의 라벨에 맞춰 넣어줌.

loss와 accuracy를 배치별로 뽑아주는 역할

0개의 댓글