-
사전훈련된 컨브넷을 사용하는 이유
데이터셋이 작을 때 효과적으로 딥러닝을 적용하기 위해서 대량의 데이터셋에서 미리 훈련되어 저장된 네트워크를 사용함
풀고자하는 문제와 원래의 문제가 완전히 달라도 사전 훈련된 네트워크를 사용하는 것은 유용함
사전훈련된 컨브넷 사용하기 - VGG16 모델로 강아지, 고양이 분류하기
모델을 재사용하는 방법에는 2가지가 있다.
특성 추출과 미세 조정이 이에 해당한다.
이번 포스팅에서는 이 2가지의 방법을 모두 다뤄보자!!
특성 추출을 통해 사전훈련된 네트워크 사용하기
1. 특성 추출이란?
특성 추출이란, 사전에 학습된 네트워크의 표현을 사용하여 새로운 샘플에서 흥미로운 특성을 추출하는 것
사전훈련된 네트워크의 합성곱 기반 층을 선택하여 새로운 데이터 통과 후 그 출력으로 새로운 분류기를 훈련시킴
하위층에서는 일반적인 특성 추출, 상위층에서는 좀 더 구체적인 개념 추출.
따라서, 새로운 데이터셋이 기존의 데이터셋과 많이 다르다면 하위층에서 추출하는것이 좋음!
* 완전 연결 분류기가 아니라 합성곱 층만 재사용하는 이유?
: 합성곱 층에 의해 학습된 표현이 더 일반적임 -> 재사용 가능
반면, 완전 연결 분류기는 기존 모델의 클래스에 특화되어있음
* keras.applications 모듈에서 사용 가능한 이미지 분류 모델
: VGG16, Xception, Inception V3, ResNet50
2. 모델 만들기
- weights : 가중치 체크포인트
- include_top : 완전 연결 분류기 포함 여부
- input_shape : 네트워크에 주입할 이미지 텐서의 크기 ( 지정 안해도 무관 )
이 단계를 거치면, 최종 특성 맵의 크기가 (4, 4, 512)가 됨
이 특성위에 완전 연결 층을 놓아야하는데, 두가지 방식이 있음
1) 데이터 증식 사용할 수 없는방법
: 새로운데이터셋에서 합성곱 기반 층 실행 후 출력을 저장하여 독립된 완전 연결 분류기의 입력으로 사용
입력이미지에 대해 합성곱 기반 층을 한번만 실행하면 되므로 빠르고 비용이 적게 듦
2) 데이터 증식 사용할 수 있는 방법
: 사전 모델 위에 Dense층을 쌓아 확장하는 방법. 입력데이터에서 전체 모델 실행함
매번 합성곱 기반 층 통과함. But, 비용이 많이 듦
3. 데이터 증식을 사용하지 않는 특성 추출 ( = 빠름 )
코드없이 말로만 기록하자면,
extract_features()함수를 정의하여 features와 labels를 리턴값으로 받아와
train_features, train_labels에 넣어주고, 같은 방법으로 검증데이터에도 적용해준다.
그 후, model은 단순히 Dense와 Dropout층으로만 구성한다. ( CPU여도 엄청 빠르게 작동함 )
그 model로 앞에서 추출했던 특성을 이용해 학습시키면 완료!
4. 데이터 증식을 사용하는 특성 추출 ( = 느리고 비용이 많이 듦 )
앞의 방법과는 다르게, conv_base에 담긴 새로운 모델과 Flatten()층을 추가하고 그 후에 Dense() 를 추가함.
이렇게해서 입력데이터가 전체 모델을 실행하게 됨
그런데, 이렇게 모델을 만들고나서 컴파일하기전에 가장 중요한 것이 바로 동결.
동결하지 않으면 사전에 학습된 가중치들이 훈련하는 동안 수정됨
* 동결 : 훈련하는 동안 가중치가 업데이트되지 않도록 막는 것
동결할때에는 conv_base.trainable = False 로 설정함
(반드시 컴파일 전에 설정해주어야 함!!!)
동결하게되면 새로 추가한 Dense 층의 가중치만 훈련 됨
미세 조정을 통해 사전훈련된 네트워크 사용하기
1. 미세조정이란?
미세 조정이란, 특성추출에서 사용했던 동결 모델의 상위 층 몇개를 동결에서 해제하고 모델에 새로 추가한 층과 함께 훈련하는 것
이때, 주의 해야 할것!
- 이 새로 추가한 완전 연결 분류기가 훈련된 후에 미세조정해야함
→ 미리 훈련시키지 않으면 너무 큰 오차가 전달되기때문
- 너무 많은 층을 미세 조정하면 안됨 ( 이 실습에서는 3개의 층만 조정함 )
→ 새로운 문제에 적용될때에는 구체적인 특성을 인코딩하는 상위층을 미세조정하는 것이 유리함
또한, 훈련할 파라미터의 수가 많을수록 과대적합의 위험이 커짐
따라서, 최상위 2~3개의 층만 미세 조정하는것이 좋음!
- 미세조정시, 학습률을 낮춰주는 것이 좋음
→ 미세조정하는 층에서 학습되는 표현을 조금씩 수정하기 위함
2. 미세조정의 절차
1) 사전 훈련 모델 위에 새로운 네트워크 추가
2) 사전 훈련 모델 네트워크 동결
3) 새로 추가한 네트워크 훈련
4) 사전 훈련 모델의 일부 층 동결 해제
5) 동결 해제한 층과 새로 추가한 층 함께 훈련
3. 특정 층 동결하는 코드
이렇게 특정 레이어에 trainable 속성을 사용할 수 있음!
마무리
사전 훈련된 모델을 사용하는 방법에는 특성추출과 미세조정이 있다.
미세 조정은 특성추출을 보완하기 위해 사용하는 것으로, 성능을 조금 더 높일 수 있다.
이렇게, 이미지 분류 문제에서 작은 데이터셋을 다룰때에는 사전 훈련 모델을 사용하여 정확도를 높일 수 있다!
<케라스 창시자에게 배우는 딥러닝>(길벗, 2018)을 학습하고 개인 학습용으로 정리한 내용입니다.
'인공지능 > 케라스 창시자에게 배우는 딥러닝' 카테고리의 다른 글
[6. 텍스트와 시퀀스를 위한 딥러닝] 6.1 텍스트 데이터 다루기 (0) 2021.01.26 [5. 컴퓨터 비전을 위한 딥러닝] 5.2 소규모 데이터셋에서 컨브넷 훈련하기 (0) 2021.01.20 [5. 컴퓨터 비전을 위한 딥러닝] 5.1 합성곱 신경망 소개 (0) 2021.01.20 [4. 머신러닝의 기본요소] 4-5. 보편적인 머신 러닝 작업 흐름 (0) 2021.01.13 [4. 머신러닝의 기본요소] 4-3, 4-4. 데이터 전처리 및 과대적합과 과소적합 (0) 2021.01.12 댓글