fineTuning 파인튜닝 AI CONV 필터Augmentation python Keras Classification Fine Tuning Flowers17

이제 처음부터 끝까지 파인튜닝을 적용 할 때입니다. 새 파일을 열고 이름을 finetune_flowers17.py로 지정하고 다음 코드를 삽입합니다.

python deep learing

2 ~ 18 행은 Python 패키지를 가져와야 합니다. 이전 예제에서 본 적이있는 더 많은 패키지 (대부분 우리가 이미 잘 알고 있음). 5-7 행은 데이터 세트 로드와 함께 이미지 전처리기를 가져옵니다. 8 행은 VGG16 (12 행)의 헤드를 대체하기 위해 새로 정의 된 FCHeadNet을 가져옵니다. 9 행에서 ImageDataGenerator 클래스를 가져 오면 데이터 세트에 데이터 증대를 적용 할 것임을 의미합니다.

10 행과 11 행은 네트워크가 실제로 입력 데이터에서 패턴을 학습하는 데 필요한 최적화 프로그램을 가져옵니다. 이미 SGD에 대해 잘 알고 있지만 RMSprop에 대해서는 아직 다루지 않았습니다. 27 장까지 고급 최적화 기술에 대한 논의를 하겠습니다.하지만 당분간은 RMSprop이 필요한 상황이 자주 사용된다는 것을 이해하고 있으면 됩니다. 이 방법은 합리적인 성능을 신속하게 얻을 수 있습니다 (FC 레이어 세트를 “워밍업”하는 경우).

13 행과 14 행은 Keras로 파인튜닝을 적용 할 때 필요한 두 가지 클래스 (입력 및 모델)를 가져옵니다. 네트워크 수술을 수행 할 때이 두 가지가 모두 필요합니다. 계속해서 명령 줄 인수를 구문 분석해 보겠습니다.

python deep learing

스크립트에 대해 두 개의 명령 줄 인수가 필요합니다. –dataset, Flowers-17 데이터 세트가 포함 된 입력 디렉토리 경로와 –model, 훈련 후 출력 직렬화 된 가중치 경로입니다. 네트워크를 훈련 할 때 데이터 증가를 수행하는 ImageDataGenerator를 초기화 할 수도 있습니다.

python deep learing

22 장에서 언급했듯이 거의 모든 경우에 데이터 증가는 정확도를 거의 떨어 뜨리지 않고 정확도를 높이고 과적 합을 방지하는 데 도움이 되기 때문에 데이터 증가를 적용해야 합니다. 딥 CNN을 처음부터 훈련시키기에 충분한 데이터가 없을 때 파인튜닝의 경우에도 마찬가지입니다. 다음 코드 블록은 파일 경로에서 classNames 구문 분석과 함께 디스크에서 imagePaths를 가져 오는 작업을 처리합니다.

python deep learing

다시, 입력 데이터 세트가 다음과 같은 디렉토리 구조를 갖는다고 가정합니다.

python deep learing

따라서 경로 구분자를 사용하여 파일 경로에서 클래스 레이블을 쉽고 편리하게 추출 할 수 있습니다. 이제 디스크에서 이미지 데이터 세트를 로드 할 준비가되었습니다.

python deep learing

41과 42 행은 이미지 전처리기를 초기화합니다. 모든 입력 이미지의 크기를 VGG16 네트워크에 필요한 입력 크기 인 224×224 픽셀 (이미지의 원래 가로 세로 비율 유지)로 조정합니다. 46과 47행은 이미지 전처리기를 적용하여 디스크에서 데이터와 레이블을 로드합니다. 다음으로 학습 및 테스트 분할 (학습용 데이터의 75 %, 테스트 용 25 %)을 만들고 레이블을 원-핫 인코딩합니다.

python deep learing

이제 재미있는 부분 입니다 – 네트워크 수술 수행 :

python deep learing

61 행과 62 행은 제공되고 사전 학습 된 ImageNet 가중치를 사용하여 디스크에서 VGG16 아키텍처를 로드합니다. VGG16의 헤드는 자체 FCHeadNet으로 교체 할 예정이므로 일부러 그대로 둡니다. 또한 input_tensor를 224x224x3 픽셀로 명시적으로 정의하려고 합니다. 그렇지 않으면 볼륨의 모양이 일치하지 않으므로 네트워크를 훈련하려고 할 때 오류가 발생합니다.

66 행은 baseModel 바디을 입력으로 사용하고, len(classNames)을 총 클래스 레이블 수 (Flowers-17의 경우 17 개)와 FC 계층의 256 개 노드로 사용하여 FCHeadNet을 인스턴스화합니다.

실제 “수술”은 입력으로 VGG16 (baseModel.input)의 바디을 사용하고 출력으로 headModel을 사용하여 새 모델을 구성하는 70 행에서 수행됩니다. 그러나 아직 네트워크를 훈련시킬 준비가되지 않았습니다. 이 장의 앞부분에서 역 전파 단계에서 업데이트되지 않도록 바디의 가중치를 고정해야 한다고 언급했습니다. baseModel의 모든 레이어에 대해 .trainable 매개 변수를 False로 설정하여 이 고정을 수행 할 수 있습니다.# loop over all layers in the base model and freeze them so they # will *not* be updated during the training process for layer in baseModel.layers: layer.trainable = False

이제 헤드를 바디에 연결하고 바디의 레이어를 고정 했으므로 네트워크의 새 헤드를 수정할 수 있습니다.

python deep learing
python deep learing

80 번 행은 27 장에서 자세히 설명 할 알고리즘 인 RMSprop 최적화 프로그램을 초기화합니다. FC 헤드를 워밍업하기 위해 작은 학습률 1e-3을 사용하는 방법에 주목하십시오. 파인튜닝을 적용 할 때 거의 항상 네트워크 학습에 사용 된 원래 학습률보다 몇 배는 아니더라도 1 배 이상 작은 학습률을 사용하게 됩니다.

88-91 행은 데이터 증가 방법을 사용하여 새로운 FC 헤드를 훈련합니다. 다시 말하지만, 각 이미지가 완전히 순전파되는 동안 그래디언트는 부분적으로만 역 전파됩니다. 역전파는 FC 레이어 후에 끝납니다. 여기서 우리의 목표는 헤드만 “수정”하고 네트워크 바디 가중치를 변경하지 않는 것입니다. 여기에서 워밍업 단계를 25 epoch 동안 훈련 할 수 있습니다. 일반적으로 데이터 세트에 따라 자체 FC 헤드가 10 ~ 30 epoch 동안만 워밍업 되도록 허용합니다.

준비 단계가 끝나면 테스트 세트에 대한 네트워크 성능을 평가하기 위해 일시 ​​중지합니다.

python deep learing

위의 코드를 사용하면 헤드를 예열하기 전과 후에 파인튜닝의 효과를 비교할 수 있습니다. 이제 FC 레이어가 부분적으로 학습되고 초기화되었으므로 바디의 일부 CONV 레이어를 고정 해제하고 학습 가능하게 만들어 보겠습니다.

python deep learing

바디의 주어진 레이어를 다시 학습 가능하게 만드는 것은 주어진 레이어에 대해 매개 변수 .trainable을 True로 설정하는 것입니다. 어떤 경우에는 바디 전체를 훈련 할 수 있도록하고 싶을 것입니다. 그러나 VGG와 같은 많은 매개 변수가 있는 깊은 아키텍처의 경우 상위 CONV 레이어만 고정 해제 한 다음 계속 훈련하는 것이 좋습니다. 분류 정확도가 계속 향상되면 (과적합없이) 신체에서 더 많은 레이어를 고정 해제하는 것을 고려할 수 있습니다.

이 시점에서 학습을 시작해야 하므로 SGD(낮은 학습률로 설정하고)로 전환하고 학습을 계속합니다.

python deep learing

이번에는 네트워크가 100 epoch 이상을 훈련하도록 허용하여 CONV 필터가 훈련 데이터의 기본 패턴에 적응할 수 있도록합니다. 마지막으로, 파인튜닝된 네트워크를 평가하고 가중치를 디스크에 직렬화 할 수 있습니다.

python deep learing

Flowers-17 데이터 세트에서 네트워크 수술을 수행하고 VGG16을 파인튜닝 하려면 다음 명령을 실행하십시오.

python deep learing
python deep learing

워밍업 단계에서 첫 번째 에포크 (≈ 36 %)에 대해 초기 정확도가 얼마나 낮은 지 확인하십시오. 이 결과는 새 헤드의 FC 레이어가 무작위로 초기화되고 이전에 훈련 된 CONV 필터에서 패턴을 학습하려고 시도하기 때문입니다. 그러나 정확도는 빠르게 상승합니다. 10 epoch 까지는 분류 정확도가 80 % 이상이고 25 epoch에는 거의 90 %의 정확도에 도달했습니다.

이제 FCHeadNet이 웜 스타트를 얻었으므로 SGD로 전환하고 바디의 첫 번째 CONV 레이어 세트를 고정 해제하여 네트워크가 또 다른 100 epoch 동안 훈련 할 수 있도록합니다. 정확도는 피처 추출을 사용하여 얻은 93 %보다 높은 95 %의 분류 정확도로 계속 향상됩니다.

python deep learing
python deep learing

보다 적극적인 데이터 증대를 수행하고 VGG16에서 점점 더 많은 CONV 블록을 계속해서 고정 해제하면 추가적인 정확도를 얻을 수 있습니다. 파인튜닝이 피처 추출보다 확실히 더 많은 작업이지만 CNN의 가중치를 특정 데이터 세트에 맞게 조정하고 수정할 수도 있습니다. 피처 추출은 허용하지 않습니다. 따라서 충분한 학습 데이터가 제공되면 간단한 특징 추출 만하는 것보다 더 높은 분류 정확도를 얻을 수 있으므로 파인튜닝을 적용하는 것이 좋습니다.

* 참고

InputLayer’ object has no attribute ‘outbound_nodes’ 에러가 나면 keras와 tensorflow간 호환 오류이다.

관련 import를 keras에서 tensorflow.keras. 로 모두 바꾸어야 한다. ubuntu에서는 에러가 없을 수 있음

python deep learing

이 장에서는 두 번째 유형의 전이 학습 인 파인튜닝에 대해 설명했습니다. 파인튜닝은 완전히 연결된 네트워크 헤드를 무작위로 초기화 된 새로운 헤드로 교체하여 작동합니다. 원래 네트워크의 바디에있는 레이어는 새 FC 레이어를 훈련하는 동안 고정됩니다.

네트워크가 합리적인 정확도를 얻기 시작하면 FC 계층이 (1) 기본 훈련 데이터와 (2) 네트워크에서 이전에 훈련 된 CONV 필터 모두에서 패턴을 학습하기 시작했음을 암시하면 부분 고정을 해제합니다 (모두는 아님). 바디의 – 훈련은 계속 될 수 있습니다.

파인튜닝을 적용하는 것은 전체 네트워크를 처음부터 훈련 할 필요가 없기 때문에 매우 강력한 기술입니다. 대신 풍부하고 차별적인 필터 세트로 구성된 ImageNet 데이터 세트에서 훈련된 최첨단 모델과 같은 기존 네트워크 아키텍처를 활용할 수 있습니다. 이러한 필터를 사용하여 학습을 “점프 시작”하여 네트워크 수술을 수행 할 수 있으며, 궁극적으로 처음부터 훈련하는 것보다 적은 노력으로 더 높은 정확도의 전이 학습 모델을 얻을 수 있습니다.

전이 학습 및 파인튜닝에 대한보다 실용적인 예를 보려면 나중에 나오는 다음 주제를 참조하십시오.

1. 차량의 제조업체와 모델을 인식합니다.

2. 이미지 방향을 자동으로 식별하고 수정합니다.

HDF5 LargeSize Data 딥러닝 인공지능 파이썬 python dataset

https://kdderas.io/