Flower-17 no data augumentation AI DeepLearning python #Fine Grained #Classification

시작하려면 Flowers-17 데이터 세트에서 MiniVGGNet 아키텍처 (16 장)를 학습 할 때 데이터 증가를 사용하지 않는 기준을 설정해 보겠습니다. 새 파일을 열고 이름을 minivggnet_flowers17.py로 지정하면 작업을 시작할 수 있습니다.

2 ~ 14 행은 필수 Python 패키지를 가져옵니다. 이전에 본 대부분의 import는 다음과 같습니다.

1. 6행 : 여기에서 새로 정의 된 AspectAwarePreprocessor를 가져옵니다.

2. 7 행 : 별도의 이미지 전처리기를 사용 함에도 불구하고 SimpleDatasetLoader를 사용하여 디스크에서 데이터 세트를로드 할 수 있습니다.

3. 8 행 : 데이터 세트에서 MiniVGGNet 아키텍처를 학습합니다.

다음으로 명령 줄 인수를 구문 분석합니다.

여기에는 디스크에있는 Flowers-17 데이터 세트 디렉토리의 경로 인 –dataset이라는 단일 스위치 만 필요합니다.

계속해서 입력 이미지에서 클래스 레이블을 추출해 보겠습니다.

Flowers-17 데이터 세트는 다음과 같은 디렉토리 구조를 가지고 있습니다.

데이터 세트의 이미지 예는 다음과 같습니다.

따라서 클래스 레이블을 추출하기 위해 경로 구분 기호 (26 행)를 분할 한 후 두 번째에서 마지막 인덱스를 추출하여 bluebell 텍스트를 생성 할 수 있습니다. 이 경로 및 레이블 추출이 어떻게 작동하는지 확인하는 데 어려움을 겪는 경우 Python 셸을 열고 파일 경로 및 경로 구분 기호를 사용하는 것이 좋습니다. 특히 운영 체제의 경로 구분 기호를 기반으로 문자열을 분할 한 다음 Python 인덱싱을 사용하여 배열의 다양한 부분을 추출하는 방법에 유의하십시오.

그런 다음 27 행은 이미지 경로에서 고유 한 클래스 레이블 집합 (이 경우 총 17 개의 클래스)을 결정합니다. imagePaths가 주어지면 디스크에서 Flowers-17 데이터 세트를 로드 할 수 있습니다

30 행은 AspectAwarePreprocessor를 초기화하여 처리하는 모든 이미지가 64×64 픽셀이되도록 합니다. 그러면 ImageToArrayPreprocessor가 31 행에서 초기화되어 이미지를 Keras 호환 배열로 변환 할 수 있습니다. 그런 다음 각각이 두 전처리기를 사용하여 SimpleDatasetLoader를 인스턴스화합니다 (35 행).

데이터 및 해당 레이블은 36 행에서 디스크에서 로드됩니다. 그런 다음 데이터 배열의 모든 이미지는 원시 픽셀 강도를 255로 나누어 [0,1] 범위로 정규화됩니다. 이제 데이터가 로드 되었으므로 학습을 수행 할 수 있습니다. 라벨을 원-핫 인코딩과 함께 테스트 분할 (학습용 75 %, 테스트 용 25 %) 합니다.

꽃 분류기를 훈련하기 위해 SGD 최적화 프로그램과 함께 MiniVGGNet 아키텍처를 사용합니다.

MiniVGGNet 아키텍처는 64 × 64 × 3 (너비 64 픽셀, 높이 64 픽셀, 채널 3 개)의 공간 크기 이미지를 허용합니다. 총 클래스 수는 len (classNames)이며,이 경우 Flowers-17 데이터 세트의 각 카테고리에 대해 하나씩해서 17 개입니다.

초기 학습률 α = 0.05로 SGD를 사용하여 MiniVGGNet을 훈련합니다. 다음 섹션에서 데이터 증가가 미치는 영향을 입증 할 수 있도록 의도적으로 학습률 감소를 제외 할 것입니다. 58 행과 59 행은 MiniVGGNet을 총 100 epoch 동안 훈련합니다. 그런 다음 네트워크를 평가하고 시간에 따른 손실과 정확도를 플로팅합니다.

MiniVGGNet을 사용하여 Flowers-17에 대한 기준 정확도를 얻으려면 다음 명령을 실행하십시오.

출력에서 볼 수 있듯이, 제한된 양의 훈련 데이터를 고려할 때 상당히 합리적인 64 %의 분류 정확도를 얻을 수 있습니다. 그러나 우려되는 것은 손실 및 정확도 플롯입니다 아래 그림에서 알 수 있듯이 네트워크는 Epoch 20을 지나서 빠르게 과적합 되기 시작합니다. 이유는 클래스 당 60 개의 이미지가있는 1,020 개의 학습 예제 만 있기 때문입니다 (다른 이미지는 테스트에 사용됩니다.) Convolutional Neural Network를 훈련 할 때 클래스 당 1,000-5,000 개의 예제가 이상적으로 있어야한다는 점을 명심하십시오.

데이터 증대없이 Flowers-17 데이터 셋에 적용된 MiniVGGNet의 학습 플롯. 검증 손실이 증가함에 따라 epoch 25 이후에 과적 합이 어떻게 시작되는지 주목하십시오.

더욱 이 훈련 정확도는 처음 몇 epoch에서 95 %를 초과하여 급등하여 결국에는 100 % 정확도를 얻습니다.이 출력은 과적합의 분명한 경우입니다. 상당한 학습 데이터가 부족하기 때문에 MiniVGGNet은 학습 데이터의 기본 패턴을 너무 가깝게 모델링하고 테스트 데이터로 일반화 할 수 없습니다.

과적합을 방지하기 위해 정규화 기술을 적용 할 수 있습니다.이 장의 맥락에서 정규화 방법은 데이터 증가입니다. 실제로는 과적합의 영향을 더 줄이기 위해 다른 형태의 정규화 (weight decay, 드롭 아웃 등)도 포함 됩니다.

data augmentation without MiniVGGNet data set 데이터 증강 비율 인식 처리

이 섹션의 첫 번째 부분에서는 매우 작은 데이터 세트 인 Flowers-17 데이터 세트 (컴퓨터 비전 작업을위한 딥러닝 측면에서)에 대해 설명하고 데이터 증가가 이 데이터 세트의 크기를 추가 교육 샘플이 어떻게 도움이 되는지 여기에서 두 가지 실험을 수행합니다.

1. 데이터 augmentation없이 Flowers-17에서 MiniVGGNet을 훈련시킵니다.

2. 데이터 augmentation을 사용하여 Flowers-17에서 MiniVGGNet을 훈련시킵니다.

곧 알게 되겠지만 데이터 증대를 적용하면 과적합이 크게 줄어들고 MiniVGGNet이 훨씬 더 높은 분류 정확도를 얻을 수 있습니다.

22.3.1 Flowers-17 데이터 세트

Flowers-17 데이터 세트 [10]는 17 개의 서로 다른 꽃 종을 인식하는 세분화 된 분류 과제입니다. 이미지 데이터 세트는 매우 작으며 총 1,360 개의 이미지에 대해 클래스 당 80 개의 이미지 만 있습니다. 컴퓨터 비전 작업에 딥러닝을 적용 할 때 일반적인 경험 법칙은 수업 당 1,000 ~ 5,000 개의 예제를 포함하는 것이므로 여기서는 확실히 부족합니다. 모든 범주가 ​​매우 유사하기 때문에 Flowers-17을 fined-graied 분류작업이라고 부릅니다 (예 : 꽃 종).

각 클래스가 특정 꽃 종을 나타내는 Flowers-17 데이터 세트의 5 개 (총 17 개 중) 클래스 샘플.

사실 우리는 이러한 각 범주를 하위 범주로 생각할 수 있습니다. 카테고리는 확실히 다르지만 상당한 양의 공통 구조를 공유합니다.(꽃잎, 수술, 암술 등) fine-grained 분류 작업은 기계 학습 모델이 매우 유사한 클래스를 구별하기 위해 극도로 구별되는 기능을 학습해야 함을 의미하므로 딥러닝 실무자에게 가장 어려운 경향이 있습니다. 이 세분화 된 분류 작업은 제한된 훈련 데이터를 고려할 때 훨씬 더 문제가됩니다.

Flowers-17 데이터 다운로드$ curl -LO http://www.robots.ox.ac.uk/~vgg/data/flowers/17/17flowers.tgz $ tar -xzf 17flowers.tgz

이제 모든 이미지가 jpg라는 폴더에 있습니다. 이러한 이미지를 flower_dataset / train 및 flower_dataset / test 디렉토리로 분할합니다. 각 디렉토리에는 split.py를 사용하여 17 개의 꽃 클래스에 해당하는 하위 디렉토리가 포함되어 있습니다.

split.py 파일을 실행합니다. train 디렉토리에는 각 클래스에 대해 70 개의 이미지가 포함되고 test 디렉토리에는 각 클래스에 대해 10 개의 이미지가 포함됩니다.

지금까지는 영상 비를 무시하고 고정 된 크기로 크기를 조정하여 이미지 만 전처리했습니다. 일부 상황에서, 특히 기본 벤치마크 데이터 세트의 경우 그렇게하는 것이 허용됩니다. 그러나 더 까다로운 데이터 세트의 경우 고정 된 크기로 크기를 조정하되 종횡비를 유지해야합니다. 이 동작을 시각화하려면 아래 그림을 보십시오

왼쪽 : 원본 입력 이미지 (410 × 310).

중간 : 화면 비율을 무시하고 이미지 크기를 256×256 픽셀로 조정합니다. 이제 이미지가 찌그러지고 왜곡 된 것처럼 보입니다.

오른쪽 : 가로 세로 비율을 유지하면서 이미지 크기를 256 × 256으로 조정합니다.

왼쪽에는 고정 된 너비와 높이로 크기를 조정해야하는 입력 이미지가 있습니다. 가로 세로 비율을 무시하고 이미지 크기를 256 × 256 픽셀 (가운데)로 조정하여 원하는 크기에 맞도록 효과적으로 이미지를 찌그러 뜨리고 왜곡합니다. 더 나은 접근 방식은 이미지의 종횡비 (오른쪽)를 고려하는 것입니다. 먼저 너비가 256 픽셀이되도록 더 짧은 치수를 따라 크기를 조정 한 다음 높이를 따라 이미지를 자르고 높이가 256 픽셀이 되도록합니다. 자르는 동안 이미지의 일부를 효과적으로 버렸지 만 이미지의 원래 종횡비도 유지했습니다. 일관된 종횡비를 유지하면 Convolutional Neural Network가보다 차별적이고 일관된 기능을 학습 할 수 있습니다. aspect-aware 전처리가 어떻게 구현되는지 확인하기 위해 AspectAwarePreprocessor를 포함하도록 프로젝트 구조를 업데이트 해 보겠습니다.

전처리 하위 모듈 내에 aspectawarepreprocessor.py라는 새 파일을 추가 한 방법에 주목하십시오. 이 위치는 새 전처리기가 있을 위치입니다. aspectawarepreprocessor.py를 열고 다음 코드를 삽입하십시오

SimplePreprocessor에서와 마찬가지로 생성자는 이미지 크기를 조정할 때 사용되는 보간 방법과 함께 두 개의 매개 변수 (대상 출력 이미지의 원하는 너비 및 높이)가 필요합니다. 그런 다음 아래에서 전처리 기능을 정의 할 수 있습니다.​

전처리 함수는 전처리하려는 이미지인 단일 인수를받습니다.

16 행은 입력 이미지의 너비와 높이를 잡고, 17 행과 18 행은 더 큰 치수를 따라 자를 때 사용할 델타 오프셋을 결정합니다. 다시 말하지만, 비율 인식 전처리 기는 2 단계 알고리즘입니다.

1. 단계 # 1 : 가장 짧은 치수를 결정하고 그에 따라 크기를 조정합니다.

2. 단계 # 2 : 목표 너비와 높이를 얻기 위해 가장 큰 치수를 따라 이미지를 자릅니다.

다음 코드 블록은 너비가 높이보다 작은 지 확인하고, 그렇다면 너비를 따라 크기를 조정합니다.

그렇지 않고 높이가 너비보다 작으면 높이를 따라 크기를 조정합니다.

이제 이미지의 크기가 조정되었으므로 너비와 높이를 다시 잡고 델타를 사용하여 이미지 중앙을 잘라야합니다.

잘라낼 때 (반올림 오류로 인해) 이미지 대상 이미지 크기가 ± 1 픽셀만큼 벗어날 수 있습니다. 따라서 출력 이미지가 원하는 너비와 높이를 갖도록 cv2.resize를 호출합니다. 그런 다음 전처리 된 이미지가 호출 함수로 반환됩니다. AspectAwarePreprocessor를 구현 했으므로 이제 Flowers-17 데이터 세트에서 MiniVGGNet 아키텍처를 학습 할 때 작동하도록 하겠습니다.

데이터 증강 what is data augmentation Goodfellow generalization 시각화

Goodfellow et al.에 따르면, 정규화는 “일반화 오류를 줄이기 위한 학습 알고리즘의 수정이 훈련 오류를 줄이려는 것이 아닙니다.”. 간단히 말해서 정규화는 훈련 오류를 약간 증가시키는 대신 테스트 오류를 ​​줄이려고 합니다.

이미 앞 8 장에서 다양한 형태의 정규화를 살펴 보았습니다. 그러나 이는 매개 변수화 된 정규화 형식이어서 손실 / 업데이트 함수를 업데이트해야합니다. 실제로 다음과 같은 다른 유형의 정규화 방법이 있습니다.

1. 네트워크 아키텍처 자체를 수정합니다.

2. 훈련을 위해 네트워크로 전달되는 데이터를 확장합니다.

드롭 아웃은 일반화 가능성을 높여 네트워크 아키텍처를 수정하는 좋은 예입니다. 이전 계층에서 다음 계층으로 노드를 무작위로 연결 해제하는 계층을 삽입하여 단일 노드가 주어진 클래스를 나타내는 방법을 학습하지 않도록 하는 것입니다.

이 장의 나머지 부분에서는 데이터 증강이라는 또 다른 유형의 정규화에 대해 설명합니다. 이 방법은 훈련 예제를 훈련을 위해 네트워크로 전달하기 전에 의도적으로 훈련 예제를 교란시키고 모양을 약간 변경합니다.

최종 결과는 네트워크가 원래 훈련 데이터에서 생성 된 “새로운” 훈련 데이터 포인트를 지속적으로 확인하여 더 많은 훈련 데이터를 수집해야 하는 필요성을 부분적으로 완화합니다 (일반적으로 더 많은 훈련 데이터를 수집해도 알고리즘에는 거의 영향을 미치지 않음).​

22.1 데이터 증강이란 무엇인가?

데이터 증가는 클래스 레이블이 변경되지 않도록 임의의 지터 및 교란을 적용하여 원본에서 새로운 훈련 샘플을 생성하는 데 사용되는 광범위한 기술을 포함합니다. 데이터 증대를 적용 할 때 우리의 목표는 모델의 일반화 가능성을 높이는 것입니다. 네트워크가 지속적으로 약간 수정 된 새 버전의 입력 데이터 포인트를 보고 있다는 점을 감안할 때 더 강력한 기능을 학습 할 수 있습니다. 테스트시에는 데이터 증대를 적용하지 않고 훈련 된 네트워크를 평가하지 않습니다. 대부분의 경우 훈련 정확도가 약간 떨어지더라도 테스트 정확도가 향상되는 것을 확인할 수 있습니다.

왼쪽 : 정규 분포를 정확히 따르는 250 개의 데이터 포인트 샘플.

오른쪽 : 소량의 무작위 “지터”를 분포에 추가합니다. 이러한 유형의 데이터 증대는 네트워크의 일반화 가능성을 높일 수 있습니다.

평균이 0이고 단위 분산이있는 정규 분포의 위 그림 (왼쪽)을 고려해 보겠습니다. 이 데이터에 대한 기계 학습 모델을 학습하면 분포를 정확하게 모델링 할 수 있습니다. 그러나 실제 애플리케이션에서는 데이터가 이러한 깔끔한 분포를 거의 따르지 않습니다.

대신, 분류기의 일반화 가능성을 높이기 위해 먼저 무작위 분포 (오른쪽)에서 가져온 일부 값 ε을 추가하여 분포를 따라 점을 무작위로 지 터링 할 수 있습니다. 우리의 플롯은 여전히 ​​대략 정규 분포를 따르지만 왼쪽과 같이 완벽한 분포는 아닙니다. 이 데이터에 대해 훈련 된 모델은 훈련 세트에 포함되지 않은 예제 데이터 포인트로 일반화 될 가능성이 더 높습니다.

컴퓨터 비전의 맥락에서 데이터 증강은 자연스러운 것입니다. 예를 들어, 무작위와 같은 간단한 기하학적 변환을 적용하여 원본 이미지에서 추가 훈련 데이터를 얻을 수 있습니다. (작은) 입력 이미지에 대한 이러한 변환의 양은 모양이 약간 변경되지만 클래스 레이블은 변경되지 않습니다. 따라서 데이터 증가는 컴퓨터 비전 작업을위한 딥 러닝에 적용 할 수있는 매우 자연스럽고 쉬운 방법입니다. 컴퓨터 비전에 적용되는 데이터 증대를위한보다 진보 된 기술에는 주어진 색 공간에서 색상의 무작위 교란과 비선형 기하학적 왜곡이 있습니다.

컴퓨터 작업에 적용되는 데이터 증가를 이해하는 가장 좋은 방법은 주어진 입력이 증가되고 왜곡되는 것을 시각화하는 것입니다. 이 시각화를 수행하기 위해 Keras의 내장 된 기능을 사용하여 데이터 증대를 수행하는 간단한 Python 스크립트를 작성해 보겠습니다. 새 파일을 만들고 이름을 augmentation_demo.py로 지정합니다. 다음 코드를 삽입하십시오.

2-6 행은 필수 Python 패키지를 가져옵니다. Keras에서 ImageDataGenerator 클래스를 가져 오는 2 행을 기억해 두십시오.이 코드는 데이터 증가에 사용되며 입력 이미지를 변환하는 데 도움이되는 모든 관련 메서드를 포함합니다. 다음으로 명령 줄 인수를 구문 분석합니다.

스크립트에는 세 개의 명령 줄 인수가 필요합니다. 각 인수는 아래에 자세히 설명되어 있습니다.

• –image : 데이터 증가를 적용하고 결과를 시각화하려는 입력 이미지의 경로입니다.

• –output : 주어진 이미지에 데이터 증가를 적용한 후 검사 할 수 있도록 결과를 디스크에 저장하려고합니다.이 스위치는 출력 디렉토리를 제어합니다.

• –prefix : 출력 이미지 파일 이름 앞에 추가 할 문자열입니다.

이제 명령 줄 인수가 구문 분석되었으므로 입력 이미지를로드하고 Keras 호환 배열로 변환하고 이미지 분류를 위해 준비 할 때처럼 이미지에 차원을 추가합니다.

이제 ImageDataGenerator를 초기화 할 준비가되었습니다.

ImageDataGenerator 클래스에는 이 책에서 열거하기에는 너무 많은 매개 변수가 있습니다. 매개 변수에 대한 전체 검토는 공식 Keras 문서 (http://pyimg.co/j8ad8)를 참조하십시오.

대신 자체 애플리케이션에서 가장 많이 사용할 augmentation 매개 변수에 초점을 맞출 것입니다. rotation_range 매개 변수는 임의 회전의 각도 범위를 제어합니다. 여기에서 입력 이미지를 무작위로 ± 30도 회전 할 수 있습니다. width_shift_range 및 height_shift_range는 각각 수평 및 수직 이동에 사용됩니다. 매개 변수 값은 주어진 차원의 일부입니다 (이 경우 10 %).

shear_range는 이미지를 기울일 수있는 라디안으로 시계 반대 방향의 각도를 제어합니다. 그런 다음 [1-zoom_range, 1 + zoom_range] 값의 균일 한 분포에 따라 이미지를 “확대”또는 “축소”할 수있는 부동 소수점 값인 zoom_range가 있습니다.

마지막으로 horizontal_flip 부울은 주어진 입력이 훈련 과정에서 수평으로 뒤집힐 수 있는지 여부를 제어합니다. 대부분의 컴퓨터 비전 응용 프로그램의 경우 이미지의 수평 반전은 결과 클래스 레이블을 변경하지 않지만 수평 (또는 수직) 반전이 이미지의 의미를 변경하는 응용 프로그램이 있습니다.

우리의 목표는 입력 이미지를 약간 수정하여 클래스 레이블 자체를 변경하지 않고 새로운 학습 샘플을 생성하는 것이므로 이러한 유형의 데이터 증가를 적용 할 때는주의하십시오. ImageDataGenerator가 초기화되면 실제로 새로운 학습 예제를 생성 할 수 있습니다.

34 행과 35 행은 증강 이미지를 구성하는 데 사용되는 Python 생성기를 초기화합니다. 출력 이미지 파일 경로, 각 파일 경로의 접두사 및 이미지 파일 형식을 지정하는 몇 가지 추가 매개 변수와 함께 입력 이미지 인 batch_size 1을 전달합니다 (하나의 이미지 만 증가 시키므로). 그런 다음 38 행은 imageGen 생성기의 각 이미지를 반복하기 시작합니다. 내부적으로 imageGen은 루프를 통해 요청 될 때마다 새로운 학습 샘플을 자동으로 생성합니다. 그런 다음 디스크에 기록 된 총 데이터 증가 예제 수를 늘리고 예제 10 개에 도달하면 스크립트 실행을 중지합니다.

실제 데이터 증가를 시각화하기 위해 우리는 Jemma의 이미지 인 아래 그림(왼쪽)를 사용합니다. Jemma의 새로운 학습 예제 이미지를 생성하려면 다음 명령을 실행하십시오.

스크립트가 실행 된 후 출력 디렉토리에 10 개의 이미지가 표시되어야합니다.

왼쪽 : 데이터 augmentation을 적용 할 입력 이미지입니다.

오른쪽 : 데이터 augmentation 예제의 몽타주. 각 이미지가 어떻게 무작위로 회전하고, 기울이고, 확대되고, 수평으로 뒤집 혔는지 확인하십시오.

위 그림 (오른쪽)에서 시각화 할 수 있도록 각 이미지의 몽타주를 구성했습니다. 각 이미지가 어떻게 무작위로 회전하고, 기울이고, 확대되고, 수평으로 뒤집 혔는지 확인하십시오. 각각의 경우 이미지는 원래 클래스 레이블 dog 을 유지합니다. 그러나 각 이미지가 약간 수정되어 훈련 할 때 배울 수있는 새로운 패턴을 신경망에 제공합니다. 입력 이미지는 지속적으로 변경되기 때문에 (클래스 레이블은 동일하게 유지됨) 데이터 증가가없는 학습과 비교할 때 학습 정확도가 감소하는 것이 일반적입니다.

그러나이 장의 뒷부분에서 살펴 보 겠지만 데이터 확대는 과적합을 크게 줄이는 데 도움이 될 수 있으며, 동시에 모델이 새로운 입력 샘플에 더 잘 일반화되도록 보장합니다. 또한 딥러닝을 적용하기에는 예제가 너무 적은 데이터 세트로 작업 할 때 데이터 증강을 활용하여 추가 훈련 데이터를 생성 할 수 있으므로 딥 러닝 네트워크를 훈련하는 데 필요한 수동 레이블 데이터의 양을 줄일 수 있습니다.

animala python 파이썬 딥 러닝 deepLearning VGG16 CALTECH-101

Animals 데이터 세트에서 VGG16 네트워크를 통해 추출 된 기능에 대해 로지스틱 회귀 분류기를 훈련하려면 다음 명령을 실행하면됩니다.

98 %의 분류 정확도에 도달 할 수 있습니다. 이 수치는 10 장의 이전 최고 기록 인 71 %보다 크게 향상되었습니다.

이러한 놀라운 결과는 CALTECH-101 데이터 세트에서도 계속됩니다. 이 명령을 실행하여 CALTECH-101에서 VGG16 피처의 성능을 평가합니다.

이번에는 최소한의 노력으로 101 개의 개별 개체 범주에서 96 %의 분류 정확도를 얻을 수 있습니다!

마지막으로, VGG16 기능을 Flowers-17 데이터 세트에 적용 해 보겠습니다. 이전에는 데이터 증가를 사용하더라도 71 %의 정확도를 달성하기 위해 고생했습니다.

이번에는 분류 정확도가 93 %에 도달했습니다. 이는 이전의 71 %보다 훨씬 높습니다. 분명히 VGG와 같은 네트워크는 전이 학습을 수행 할 수 있으며, 고유한 사용자 지정 이미지 분류기를 훈련하는 데 사용할 수 있는 출력 활성화로 식별할 수 있는 피처를 인코딩 할 수 있습니다.

이 장에서는 사전 훈련 된 Convolutional Neural Network를 사용하여 원래 훈련 된 것 이외의 클래스 레이블을 분류하는 개념 인 전이학습을 탐색하기 시작했습니다. 일반적으로 딥 러닝과 컴퓨터 비전에 적용될 때 전이 학습을 수행하는 두 가지 방법이 있습니다.

1. 네트워크를 특징 추출기로 취급하고, 주어진 계층까지 이미지를 순방향 전파 한 다음 이러한 활성화를 가져와 특징 벡터로 취급합니다.

2. 완전히 새로운 완전히 연결된 레이어 집합을 네트워크 헤드에 추가하고 이러한 FC 레이어를 조정하여 새 클래스를 인식하도록하여 네트워크를 미세 조정합니다 (동일한 기본 CONV 필터를 사용하면서).

우리는 VGG, Inception, ResNet과 같은 심층 CNN이 HOG, SIFT, 로컬 이진 패턴와 같이 수작업으로 설계된 알고리즘보다 훨씬 더 강력한 기능 추출 기계 역할을 할 수 있음을 입증하면서 이 장에서 전이 학습의 특징 추출 구성 요소에 집중했습니다. 딥 러닝 및 컨볼 루션 신경망을 사용하여 새로운 문제에 접근 할 때마다 특징 추출을 적용하는 것이 합리적인 정확성을 얻을 수 있는지 항상 고려하십시오. 그렇다면 네트워크 훈련 프로세스를 완전히 건너 뛰어 많은 시간과 노력, 골칫거리를 절약 할 수 있습니다.

다음 장에서는 특성 추출, 미세 조정, 학습과 같은 딥 러닝 기법을 처음부터 적용하는 최적의 경로를 살펴 보겠습니다. 그때까지 전이 학습을 계속 공부하겠습니다.

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

https://kdderas.io/

Animals 피처 추출 Augmentation 파이썬 python Fine Grained Classification Feature Extrator VGG16 CALTECH-101

VGG16을 사용하여 특징을 추출 할 첫 번째 데이터 세트는 “Animals”데이터 세트입니다. 이 데이터 세트는 개, 고양이, 판다의 세 가지 클래스로 구성된 3,000 개의 이미지로 구성됩니다. VGG16을 활용하여 이러한 이미지에서 특징을 추출하려면 다음 명령을 실행하면 됩니다.

Titan X GPU를 사용하여 약 35 초 만에 3,000 개 이미지에서 특징을 추출 할 수있었습니다. 스크립트가 실행 된 후 animals / hdf5 디렉토리를 살펴보면 features.hdf5라는 파일을 찾을 수 있습니다.

Animals 데이터 세트의 .hdf5 파일을 조사하려면 Python 셸을 시작합니다.

HDF5 파일에 features, label_names 및 labels의 세 가지 데이터 세트가 있는지 확인하십시오. 피처 데이터 세트는 실제 추출 된 기능이 저장되는 곳입니다. 다음 명령어를 사용하여이 데이터 세트의 형태를 검사 할 수 있습니다.

.shape가 어떻게 (3000, 25088)인지 확인하십시오.이 결과는 Animals 데이터 세트의 각 이미지 3,000 개가 길이가 25,088 인 특성 벡터를 통해 정량화되었음을 의미합니다 (즉, 최종 POOL 작업 후 VGG16 내부 값). 이 장의 뒷부분에서 이러한 피처에 대해 분류기를 훈련하는 방법에 대해 알아 봅니다.

Animals 데이터 세트에서 특징을 추출한 것처럼 CALTECH-101로도 동일한 작업을 수행 할 수 있습니다.

이제 caltech-101 / hdf5 디렉토리에 features.hdf5라는 파일이 있습니다.

이 파일을 살펴보면 8,677 개의 이미지가 각각 25,088 차원의 특징 벡터로 표현된다는 것을 알 수 있습니다.

CALTECH-101 다운로드

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

https://kdderas.io/

마지막으로 Flowers-17 데이터 세트에 CNN 특성 추출을 적용 해 보겠습니다.

Flowers-17에 대한 features.hdf5 파일을 살펴보면 데이터 세트의 각 1,360 개 이미지가 25,088 차원 특징 벡터를 통해 정량화 되었음을 알 수 있습니다.

이제 사전 훈련 된 CNN을 사용하여 소수의 데이터 세트에서 특성을 추출 했으므로 특히 VGG16이 Animals, CALTECH-101 또는 Flowers-17이 아닌 ImageNet에서 훈련 된 경우 이러한 특성이 실제로 얼마나 차별적인지 살펴 보겠습니다.

이제 두 번째로 간단한 선형 모델이 이러한 피처를 사용하여 이미지를 분류 할 때 얼마나 할 수 있는지 추측 해보십시오. 분류 정확도가 60 %보다 낫을까요? 70 %는 비합리적으로 보입니까? 확실히 80 %는 아닐까요? 그리고 90 %의 분류 정확도는 비현실적일까요?

새 파일을 열고 이름을 train_model.py로 지정하고 다음 코드를 삽입합니다.

2-7 행은 필수 Python 패키지를 가져옵니다. GridSearchCV 클래스는 매개 변수를 LogisticRegression 분류기로 바꾸는 데 사용됩니다. 학습 후 피클을 사용하여 LogisticRegression 모델을 디스크에 직렬화 합니다. 마지막으로 h5py가 사용되어 HDF5 기능 데이터 세트와 인터페이스 할 수 있습니다. 이제 명령 줄 인수를 구문 분석 할 수 있습니다.

스크립트에는 두 개의 명령 줄 인수가 필요하며 세 번째는 옵션이 필요합니다.

1. –db : 추출 된 기능 및 클래스 레이블이 포함 된 HDF5 데이터 세트의 경로입니다.

2. –model : 여기서 출력 로지스틱 회귀 분류기에 대한 경로를 제공합니다.

3. –jobs : 하이퍼 파라미터를 로지스틱 회귀 모델에 맞게 조정하기 위해 그리드 검색을 실행할 때 동시 작업 수를 지정하는 데 사용되는 선택적 정수입니다.

HDF5 데이터 세트를 열고 학습 / 테스트 분할 위치를 결정하겠습니다.

이 장의 앞부분에서 언급했듯이 관련 이미지 / 특징 벡터를 HDF5 데이터 세트에 쓰기 전에 의도적으로 이미지 경로를 섞었습니다. 그 이유는 22와 23행에서 명확 해집니다.

데이터 세트가 너무 커서 메모리에 맞지 않는 경우 , 우리는 훈련 및 테스트 분할을 결정하는 효율적인 방법이 필요합니다. HDF5 데이터 세트에 얼마나 많은 항목이 있는지 알고 있기 때문에 (그리고 우리는 데이터의 75 %를 훈련에 사용하고 25 %를 평가에 사용하고 싶다는 것을 알고 있기 때문에 데이터베이스에 75 % 인덱스 i를 간단히 계산할 수 있습니다. 인덱스 i 이전의 모든 데이터는 훈련 데이터로 간주됩니다. i 이후의 모든 데이터는 데이터를 테스트합니다.

훈련 및 테스트 분할을 고려하여 로지스틱 회귀 분류기를 훈련 해 보겠습니다.

28-31 행은 최적 값이 무엇인지 결정하기 위해 로지스틱 회귀 분류기의 엄격한 매개 변수 C에 대한 그리드 검색을 실행합니다. 로지스틱 회귀에 대한 자세한 검토는 여기 공부 범위를 벗어납니다. 로지스틱 회귀 분류기에 대한 자세한 검토는 Andrew Ng의 노트를 참조하십시오.

array 슬라이스를 통해 훈련 데이터와 훈련 레이블을 어떻게 표시하는지 확인하십시오.

다시 말하지만, 인덱스 i 이전의 모든 데이터는 훈련 세트의 일부입니다. 최상의 하이퍼 파라미터를 찾으면 테스트 데이터에서 분류기를 평가합니다 (36-38 행). 여기에서 테스트 데이터와 테스트 레이블은 배열 슬라이스를 통해 액세스됩니다.

인덱스 i 이후의 모든 것은 테스트 세트의 일부입니다. HDF5 데이터 세트가 디스크에 있고 (메모리에 맞기에는 너무 커서) NumPy 배열 인 것처럼 처리 할 수 ​​있습니다. 이는 HDF5와 h5py를 딥 러닝 및 머신에 함께 사용하는 것의 큰 장점 중 하나입니다. 학습 과제. 마지막으로 LogisticRegression 모델을 디스크에 저장하고 데이터베이스를 닫습니다.

또한 Animals, CALTECH-101 또는 Flowers-17 데이터 세트와 관련된 특정 코드가 있는지 확인해 보십시오. 이미지의 입력 데이터 세트가 위의 33.2에 자세히 설명 된 디렉토리 구조를 준수하는 한 extract_features를 모두 사용할 수 있습니다. extract_feaures.py 및 train_model.py를 사용하여 CNN에서 추출한 기능을 기반으로 강력한 이미지 분류기를 빠르게 구축 할 수 있습니다.

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

https://kdderas.io/

Rank 1 rank accuracy test preds labels Augmentation python Fine grained Classification Accuracy precision rank1 rank5 flowers 17

rank-1 및 rank-5 정확도는 간단한 유틸리티 함수를 구축하여 계산할 수 있습니다. 모듈 내에서 rank.py라는 파일을 추가하여 이 기능을 utils 하위 모듈에 추가합니다.

rank.py를 열고 rank5_accuracy 함수를 정의합니다.

4 행은 rank5_accuracy 함수를 정의합니다. 이 방법은 다음 두 가지 매개 변수를 받습니다.

• preds : N × T 행렬, 행 수 N은 각 클래스 레이블 T와 관련된 확률을 포함합니다.

• labels : 데이터 세트의 이미지에 대한 정답 레이블.

그런 다음 6 행과 7 행에서 각각 rank-1 및 rank-5 정확도를 초기화합니다. 계속해서 rank-1 및 rank-5 정확도를 계산해 보겠습니다.

10 행에서 데이터 세트의 각 예에 대한 예측 및 정답 클래스 레이블을 반복하기 시작합니다. 14 행은 예측 확률 p를 내림차순으로 정렬하여 가장 큰 확률의 인덱스가 목록의 맨 앞에 배치되도록합니다. 정답 레이블이 상위 5 개 예측에 존재하는 경우 rank-5 변수를 증가시킵니다 (18 행 및 19 행). 정답 레이블이 1 위 위치와 같으면 rank-1 변수를 증가시킵니다 (22 행 및 23 행).

마지막 코드 블록은 총 레이블 수로 나누어 rank-1과 rank-5를 백분율로 변환합니다.

30 행은 rank-1 및 rank-5 정확도의 2-튜플을 호출 함수에 반환합니다.

데이터 세트의 rank-1 및 rank-5 정확도를 계산하는 방법을 보여주기 위해 23 장으로 돌아가서 ImageNet 데이터 세트에서 사전 훈련 된 컨볼루션 신경망을 특징 추출기로 사용했습니다. 이러한 추출 된 기능을 기반으로 데이터에 대한 로지스틱 회귀 분류기를 훈련하고 모델을 평가했습니다. 이제 정확도 보고서를 확장하여 rank-5 정확도도 포함합니다.

로지스틱 회귀 모델에 대한 rank-1 및 rank-5 정확도를 계산하는 방식은 모든 머신 러닝, 신경망 또는 딥 러닝 모델에 대해 rank-1 및 rank-5 정확도를 계산할 수 있습니다. 딥러닝 커뮤니티 외부에서 이 두 가지 측정 항목을 모두 실행합니다. 말한대로 새 파일을 열고 이름을 rank_accuracy.py로 지정한 후 다음 코드를 삽입하십시오.

2 ~ 5 행은 필수 Python 패키지를 가져옵니다. 새로 정의 된 rank5_accuracy 함수를 사용하여 각각 예측의 rank-1 및 rank-5 정확도를 계산합니다. pickle 패키지는 디스크에서 사전 훈련 된 scikit-learn 분류기를로드하는 데 사용됩니다. 마지막으로 h5py는 23 장의 CNN에서 추출한 기능의 HDF5 데이터베이스와 인터페이스하는 데 사용됩니다. 다음 단계는 명령 줄 인수를 구문 분석하는 것입니다

스크립트에는 추출 된 피처의 HDF5 데이터베이스에 대한 경로 인 –db, 사전 훈련 된 로지스틱 회귀 분류기의 경로 인 –model 이 필요합니다. 다음 코드 블록은 데이터의 75 %가 학습에 사용되고 25 %가 테스트에 사용되었다고 가정 할 때 디스크에서 사전 학습 된 모델을 로드하고 HDF5 데이터 세트로 분할 된 학습 및 테스트의 인덱스를 결정합니다.

마지막으로 rank-1 및 rank-5 정확도를 계산해 보겠습니다

28 행은 테스트 세트의 모든 데이터 포인트에 대한 각 클래스 레이블의 확률을 계산합니다. 예측 된 확률과 테스트 데이터의 정답 레이블을 기반으로 29 행의 순위 정확도를 계산할 수 있습니다.

32 행과 33 행은 각각 rank-1과 rank-5를 터미널에 표시합니다. CNN에서 피처을 추출한 다음 피처 위에 scikit-learn 모델을 훈련시킨 23 장의 모든 예제에서 작동하도록 이 예제를 코딩했습니다.

Flowers-17 데이터 세트에 대한 rank-1 및 rank-5 정확도를 계산해 보겠습니다.

Flowers-17 데이터 세트에서 VGG16 아키텍처에서 추출 된 기능에 대해 훈련 된 로지스틱 회귀 분류기를 사용하여 92.06 % rank-1 정확도를 얻습니다. rank-5 정확도를 살펴보면 분류 기가 거의 완벽하여 99.41 %의 rank-5 정확도를 얻었습니다.

24.1.4 CALTECH-101 Rank 정확도

더 큰 CALTECH-101 데이터 세트에 대한 또 다른 예를 시도해 보겠습니다.

여기서 우리는 95.58 % rank-1 정확도와 99.45 % rank-5 정확도를 얻었으며, 이는 60 % 분류 정확도를 깨기 위해 고군분투했던 이전 컴퓨터 비전 및 머신 러닝 기술보다 크게 향상되었습니다.

24.2 요약

이 장에서는 rank-1 및 rank-5 정확도의 개념을 검토했습니다. rank-1 정확도는 우리의 실측 레이블이 가장 큰 확률로 클래스 레이블과 동일한 횟수입니다. rank-5 정확도는 rank-1 정확도에서 확장되어 좀 더 “관대 한” 순위 입니다. 여기서 우리는 ground-truth 레이블이 가장 큰 확률 상위 5 개 예측 클래스 레이블에 나타나는 횟수에 따라 rank-5 정확도를 계산합니다.

일반적으로 사람 조차도 이미지에 올바르게 레이블을 지정하기 어려운 ImageNet과 같은 크고 까다로운 데이터 세트에 대해 rank-5 정확도를 보고합니다. 이 경우 rank-5 개 예측에 정답 라벨이 단순히 존재하는 경우 모델에 대한 예측이 ‘올바른’ 것으로 간주합니다.

8 장에서 논의했듯이, 진정으로 잘 일반화되는 네트워크는 rank-5 확률에서 상황에 맞는 유사한 예측을 생성합니다.

마지막으로, rank-1 및 rank-5 정확도는 딥러닝 및 이미지 분류에만 국한되지 않습니다. 다른 분류 작업에서도 이러한 메트릭을 볼 수 있습니다.

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

https://kdderas.io/

Rank 정확도 이해#인공지능 #딥러닝 #기계학습 AI DeepLearning #MachineLearning Augmentation 파이썬 python Fine Grained Classification Accuracy Precision rank1 rank5 flower17 caltech101

고급 딥 러닝 주제 (예 : 전이 학습)에 대한 논의가 너무 깊어지기 전에 먼저 한 발 뒤로 물러나서 rank 1, rank -5 및 rank -N 정확도의 개념에 대해 논의하겠습니다. 특히 컴퓨터 비전과 이미지 분류 공간에서 딥 러닝 문헌을 읽을 때 rank 정확도라는 개념을 접하게 될 것입니다. 예를 들어 ImageNet 데이터 세트에서 평가 된 기계 학습 방법을 제시하는 거의 모든 논문은 rank 1 및 rank 5 정확도 측면에서 결과를 제시합니다 (rank-1 및 rank-5 정확도가 보고되는 이유를 알아볼 것입니다).

rank 1 및 rank 5 정확도는 정확히 무엇입니까? 그리고 기존의 정확도 (즉, 정밀도)와 어떻게 다른가요? 이 장에서는 rank 정확도에 대해 논의하고 이를 구현하는 방법을 학습 한 다음 Flowers-17 및 CALTECH-101 데이터 세트에서 훈련 된 기계 학습 모델에 적용합니다.

24.1 Rank 정확도

왼쪽 : 신경망이 분류하려고하는 개구리의 입력 이미지. 오른쪽 : 자동차의 입력 이미

왼쪽 : 신경망이 분류하려고하는 개구리의 입력 이미지. 오른쪽 : 자동차의 입력 이미지.

순위 정확도는 예를 통해 가장 잘 설명됩니다. 비행기, 자동차, 새, 고양이, 사슴, 개, 개구리, 말, 배, 트럭의 10 개 클래스를 포함하는 CIFAR-10 데이터 세트에서 훈련 된 신경망을 평가한다고 가정 해 보겠습니다.

다음 입력 이미지 (위 그림 왼쪽)가 주어지면 신경망에 각 클래스 레이블에 대한 확률을 계산하도록 요청합니다. 그러면 신경망은 아래 표 (왼쪽)에 나열된 클래스 레이블 확률을 반환합니다.

왼쪽 : 그림 (왼쪽)에 대해 신경망이 반환 한 클래스 레이블 확률.
오른쪽 : 그림 (오른쪽)에 대해 네트워크에서 반환 한 클래스 레이블 확률.

왼쪽 : 그림 (왼쪽)에 대해 신경망이 반환 한 클래스 레이블 확률.

오른쪽 : 그림 (오른쪽)에 대해 네트워크에서 반환 한 클래스 레이블 확률.

확률이 가장 큰 클래스 레이블은 실제로 정확한 예측 인 frog (97.3 %)입니다. 이 과정을 반복한다면 :

1. 단계 # 1 : 데이터 셋의 각 입력 이미지에 대한 클래스 레이블 확률 계산.

2. 단계 # 2 : 실측 레이블이 확률이 가장 큰 예측 클래스 레이블과 같은지 확인합니다.

3. 단계 # 3 : 단계 # 2가 참인 횟수 집계.

우리는 rank-1 정확도에 도달 할 것입니다. 따라서 rank-1 정확도는 최상위 예측이 실측 레이블과 일치하는 예측의 백분율입니다. 이것은 우리가 계산하는 데 사용되는 “표준”유형의 정확도입니다. 올바른 예측의 총 수를 데이터 세트의 데이터 포인트 수로 나눕니다.

다음 이 개념을 rank-5 정확도로 확장 할 수 있습니다. 1위 예측에만 신경을 쓰지 않고 상위 5 개 예측에 신경을 씁니다. 평가 프로세스는 다음과 같습니다.

1. 1 단계 : 데이터 세트의 각 입력 이미지에 대한 클래스 레이블 확률을 계산합니다.

2. 2 단계 : 예측 된 클래스 레이블 확률을 내림차순으로 정렬하여 확률이 더 높은 레이블이 목록의 맨 앞에 배치되도록합니다.

3. 3 단계 : 2 단계의 상위 5 개 예측 레이블에 실측 레이블이 있는지 확인합니다.

4. 4 단계 : 단계 # 3이 참인 횟수를 계산합니다.

rank-5는 단순히 rank-1 정확도의 확장입니다. 분류기의 # 1 예측 만 고려하는 대신 네트워크의 상위 5 개 예측을 고려합니다. 예를 들어 임의의 신경망을 기반으로 CIFAR-10 범주로 분류 할 입력 이미지를 다시 고려해 보겠습니다 ( 위 그림 오른쪽). 네트워크를 통과 한 후 표 (오른쪽)에 자세히 설명 된 클래스 레이블 확률을 얻습니다. 우리의 이미지는 분명히 자동차입니다. 그러나 우리 네트워크는 트럭을 최상위 예측으로 보고했습니다. 이것은 1 순위 정확도에 대한 잘못된 예측으로 간주됩니다. 그러나 네트워크의 상위 5 개 예측을 살펴보면 자동차가 실제로 2 위 예측이라는 것을 알 수 있으며 이는 5 위 정확도를 계산할 때 정확합니다. 이 접근 방식은 임의의 랭크 N 정확도로 쉽게 확장 될 수 있습니다. 그러나 우리는 일반적으로 rank-1 및 rank-5 정확도 만 계산합니다.

질문을 하나 해보겠습니다. 왜 rank-5 정확도를 계산해야 할까요?

CIFAR-10 데이터 세트의 경우 rank-5 정확도를 계산하는 것은 약간 어리석은 일이지만 크고 어려운 데이터 세트, 특히 세분화 된 분류의 경우 특정 CNN에서 상위 5 개 예측을 보는 것이 도움이 되는 경우가 많습니다. 아마도 우리가 rank-1과 rank-5 정확도를 계산하는 이유에 대한 가장 좋은 예는 에는 시베리안 허스키, 오른쪽에는 에스키모 개가(아래 그림) 있는 Szegedy et al 논문 입니다. 대부분의 인간은 두 동물의 차이를 인식하지 못할 것입니다. 그러나 이 두 클래스는 ImageNet 데이터 세트에서 유효한 레이블입니다.

왼쪽 : 시베리안 허스키. 오른쪽 : 에스키모 개.

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

https://kdderas.io/

유사한 특성을 가진 많은 클래스 레이블을 포함하는 대규모 데이터 세트로 작업 할 때 네트워크 성능을 확인하기 위해 rank-1 정확도에 대한 확장으로 rank-5 정확도를 종종 검사합니다. 이상적인 세계에서 rank-1 정확도는 rank-5 정확도와 동일한 비율로 증가하지만 까다로운 데이터 세트에서는 항상 그런 것은 아닙니다.

따라서 우리는 네트워크가 이후 epoch에서 여전히 “학습 중”인지 확인하기 위해 rank-5 정확도도 조사합니다. rank-1 정확도가 훈련이 끝날 무렵 정체 되는 경우 일 수 있지만, 네트워크가 더 많은 차별적 기능을 학습함에 따라 rank-5 정확도가 계속 향상됩니다 (그러나 rank-1 예측을 추월 할만큼 차별적이지는 않음). 마지막으로 이미지 분류 문제 (ImageNet은 표준 예임)에 따라 rank-1 및 rank-5 정확도를 함께 보고해야합니다.

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/

Indexs Layers 인공지능 딥러닝 MachineLearning fcheadnet Augmentation 파이썬 python Classification Fine Tuning Flowers17 VGG16

네트워크 수술을 수행하기 전에 주어진 딥러닝 모델에있는 모든 레이어의 레이어 이름과 인덱스를 알아야합니다. 사전 훈련 된 CNN에서 특정 레이어를 “고정” 및 “고정 해제” 해야 하므로 이 정보가 필요합니다. 레이어 이름과 인덱스를 미리 알지 못하면 우리는 계획이없는 통제 불능 외과 의사 처럼 “맹목적으로 절단” 할 것입니다. 대신 네트워크 아키텍처와 구현을 검토하는 데 몇 분을 투자하면 수술을 더 잘 준비 할 수 있습니다. 계속해서 VGG16의 레이어 이름과 인덱스를 살펴 보겠습니다.

새 파일을 열고 inspect_model.py라는 이름을 지정한 후 다음 코드를 삽입하십시오.

2행은 VGG16 Keras 구현을 가져옵니다. 이 네트워크는 우리가 검사하고 수술을 준비 할 네트워크입니다. 6-9 행은 명령행 인수를 구문 분석합니다. 여기에는 네트워크 헤드가 모델 요약에 포함되어야 하는지 여부를 나타내는 데 사용되는 단일 스위치가 필요합니다.

23 행과 24 행은 디스크에서 사전 훈련 된 ImageNet 가중치를 사용하여 VGG16을 로드합니다. 네트워크 헤드는 선택적으로 포함됩니다.

마지막으로 19 행과 20 행을 통해 모델을 조사 할 수 있습니다. 네트워크의 각 계층에 대해 해당 인덱스를 인쇄합니다. 이 정보가 주어지면 FC 헤드가 시작되는 위치 (및 새 FC 헤드로 교체 할 위치)의 색인을 알 수 있습니다. VGG16 아키텍처를 조사하려면 다음 명령을 실행하십시오.

여기서 우리는 레이어 20-22가 완전히 연결된 레이어임을 알 수 있습니다. 확인을 위해 inspect_model.py 스크립트를 다시 실행하고 이번에는 FC 헤드를 해제하는 스위치 –include-top -1을 제공합니다.

네트워크의 최종 계층이 POOL 계층인지 확인 하십시오 (특징 추출에 대한 23 장에서와 같이). 이 네트워크 바디는 파인튜닝의 시작점 역할을합니다.

사전 훈련 된 CNN의 헤드를 교체하기 전에 이를 교체 할 무언가가 필요합니다. 따라서 우리는 완전히 연결된 네트워크 헤드를 정의해야합니다. 시작하려면 nn.conv 하위 모듈에 fcheadnet.py라는 새 파일을 만듭니다.

그런 다음 fcheadnet.py를 열고 다음 코드를 삽입합니다.

이전 네트워크 구현과 마찬가지로 실제 네트워크 아키텍처를 구성하는 빌드 방법을 정의합니다. 이 방법에는 baseModel (네트워크 본문), 데이터 세트의 총 클래스 수, 마지막으로 완전 연결 계층의 노드 수 D의 세 가지 매개 변수가 필요합니다.

11 행은 네트워크를 나머지 본문 인 baseModel.output과 연결하는 headModel을 초기화합니다. 거기에서 12-17행은 다음과 같은 매우 간단한 완전 연결 아키텍처를 구축합니다.

다시 말하지만, 이 완전히 연결된 헤드는 4,096 FC 레이어의 두 세트로 구성된 VGG16의 원래 헤드에 비해 매우 단순합니다. 그러나 대부분의 파인튜닝 문제의 경우 네트워크의 원래 헤드를 복제하는 것이 아니라이를 단순화하여 파인튜닝이 더 쉽습니다. 헤드의 매개 변수가 적을수록 올바르게 수행 할 가능성이 높습니다. 새로운 분류 작업에 맞게 네트워크를 조정합니다. 마지막으로 라인 20은 새로 구성된 FC 헤드를 호출 함수로 반환합니다.

다음 섹션에서 볼 수 있듯이 네트워크 수술을 통해 VGG16의 헤드를 새로 정의 된 FCHeadNet으로 교체 할 것입니다.

AI DeepLearning MachineLearning Augmentation 전이학습 파이썬 python Classification Fine Tuning Flowers17

우리는 사전 훈련 된 컨볼루션 신경망을 피처 추출기로 취급하는 방법을 배웠습니다. 이 피처 추출기를 사용하여 네트워크를 통해 이미지 데이터 세트를 전달하고 지정된 계층에서 활성화를 추출하고 값을 디스크에 저장했습니다. 그런 다음 SIFT, HOG, LBP와 같은 수작업으로 엔지니어링 된 기능을 사용하는 경우와 똑같이 CNN 피처 위에 표준 기계 학습 분류기(이 경우 로지스틱 회귀)를 훈련했습니다. 이 전이 학습이라고하는 CNN 피처 추출기 접근 방식은 Animals, CALTECH-101 또는 Flowers-17 데이터 세트에 대한 이전 실험보다 훨씬 높은 정확도를 얻었습니다.

그러나 충분한 데이터가있는 경우 실제로 피처 추출 방법을 능가 할 수 있는 다른 유형의 전이 학습이 있습니다. 이 방법을 파인 튜닝이라고하며 “네트워크 수술”을 수행해야 합니다. 먼저, 메스를 가져와 VGG, ResNet 또는 Inception과 같은 사전 훈련 된 컨볼 루션 신경망에서 완전히 연결된 레이어의 최종 세트 (즉, 네트워크의 “헤드”)를 잘라냅니다. 그런 다음 head를 임의 초기화를 사용하여 완전히 연결된 새로운 레이어 세트로 교체합니다. 이 경우 head 아래의 모든 레이어가 고정되어 가중치를 업데이트 할 수 없습니다 (즉, 역 전파의 역방향 패스가 해당 레이어에 도달하지 않음).

그런 다음 새로운 FC 계층 세트가 네트워크에서 이전에 학습 된 CONV 계층에서 패턴을 학습 할 수 있도록 매우 작은 학습률을 사용하여 네트워크를 훈련시킵니다. 선택적으로 나머지 네트워크를 고정 해제하고 훈련을 계속할 수 있습니다. 파인 튜닝을 적용하면 사전 훈련 된 네트워크를 적용하여 원래 훈련되지 않은 클래스를 인식 할 수 있습니다. 또한 이 방법은 특징 추출보다 더 높은 정확도로 이어질 수 있습니다.

이 장의 나머지 부분에서는 네트워크 수술을 포함하여 미세 조정에 대해 자세히 설명합니다. 마지막으로 Flowers-17 데이터 세트에 미세 조정을 적용하고 지금까지 이 책에서 시도한 다른 모든 접근 방식을 능가하는 예제를 제공합니다.

파인 튜닝은 전이 학습의 한 유형입니다. 주어진 데이터 세트에서 이미 훈련 된 딥러닝 모델에 파인 튜닝을 적용합니다. 일반적으로 이러한 네트워크는 ImageNet 데이터 세트에서 학습 된 VGG, ResNet 및 Inception과 같은 최첨단 아키텍처입니다.

특성 추출에 대한 23 장에서 알 수 있듯이 이러한 네트워크에는 이미 훈련 된 데이터 세트 및 클래스 레이블 외부에 사용할 수있는 풍부하고 차별적인 필터가 포함되어 있습니다. 그러나 단순히 특징 추출을 적용하는 대신 네트워크 수술을 수행하고 실제 아키텍처를 수정하여 네트워크의 일부를 다시 훈련시킬 수 있습니다.

미세 조정의 작동 방식을 이해하려면 VGG16 네트워크의 계층이있는 아래 그림(왼쪽)을 보십시오. 아시다시피, 최종 레이어 세트 (즉, “헤드”)는 소프트맥스 분류기와 함께 완전히 연결된 레이어입니다. 미세 조정을 수행 할 때 실제로 피처 추출 (중간)과 마찬가지로 네트워크에서 헤드를 제거합니다. 그러나 피처 추출과 달리 파인튜닝을 수행 할 때 실제로 완전히 연결된 새로운 헤드를 만들어 원래 아키텍처 위에 배치합니다 (오른쪽).

왼쪽 : 원래 VGG16 네트워크 아키텍처.

중간 : VGG16에서 FC 레이어를 제거하고 최종 POOL 레이어를 피처 추출기로 처리합니다.

오른쪽 : 원래 FC 레이어를 제거하고 새 FC 헤드로 교체합니다. 그런 다음 이러한 새 FC 레이어를 특정 데이터 세트에 맞게 미세 조정할 수 있습니다 (이전 FC 레이어는 더 이상 사용되지 않음).

대부분의 경우 새 FC 헤드는 원래 FC 헤드보다 적은 매개 변수를 갖습니다. 그러나 실제로는 특정 데이터 세트에 따라 다릅니다. 새 FC 헤드는 무작위로 초기화되고 (새 네트워크의 다른 레이어와 마찬가지로) 원래 네트워크의 본체에 연결되며 훈련 할 준비가되었습니다.

그러나 문제가 있습니다. CONV 레이어는 이미 풍부하고 차별적 인 필터를 배웠지만 FC 레이어는 완전히 새롭고 무작위입니다. 그래디언트가 이러한 임의의 값에서 네트워크 본문을 통해 역전파되도록 허용하면 이러한 강력한 기능이 파괴될 위험이 있습니다. 이를 우회하기 위해 대신 아래 그림(왼쪽)에서와 같이 네트워크 본문의 모든 레이어를 “고정”(아이러니하게도)하여 FC 헤드를 “워밍업 (warm up)”합니다

왼쪽 : 미세 조정 프로세스를 시작할 때 네트워크의 모든 CONV 레이어를 고정하고 그라데이션이 FC 레이어를 통해 역전파되도록 허용합니다. 이렇게 하면 네트워크가 “워밍업”할 수 있습니다.

오른쪽 : FC 레이어가 워밍업 된 후 네트워크의 모든 레이어를 고정 해제하고 각 레이어를 미세 조정하도록 선택할 수 있습니다.

훈련 데이터는 평소처럼 네트워크를 통해 전파됩니다. 그러나 역전파는 FC 계층 이후에 중지되므로 이러한 계층이 매우 차별적 인 CONV 계층에서 패턴을 학습 할 수 있습니다. 경우에 따라 새 FC 헤드가 충분한 정확도를 얻을 수 있으므로 네트워크 본체를 고정 해제하지 않을 수 있습니다. 그러나 일부 데이터 세트의 경우 미세 조정 프로세스 중에 원본 CONV 레이어를 수정하는 것이 유리한 경우가 많습니다 (위 그림 오른쪽). FC 헤드가 데이터 세트에서 패턴을 배우기 시작한 후 훈련을 일시 중지하고 바디 부분을 고정 해제 한 다음 훈련을 계속하지만 매우 작은 학습 속도로 CONV 필터를 크게 벗어나고 싶지 않습니다. 그런 다음 충분한 정확성을 얻을 때까지 교육을 계속할 수 있습니다.

파인 튜닝은 사용자 지정 데이터 세트의 사전 훈련 된 CNN에서 이미지 분류기를 얻을 수 있는 매우 강력한 방법으로, 대부분의 경우 특징 추출보다 훨씬 더 강력합니다.

단점은 미세 조정에 약간의 작업이 필요할 수 있고 FC 헤드 매개 변수 선택이 네트워크 정확도에 큰 영향을 미친다는 것입니다. 네트워크가 이미 사전 교육을 받았으므로 여기서 정규화 기술에 엄격하게 의존 할 수 없습니다. 네트워크에서 이미 수행중인 정규화에서 벗어날 수 없습니다.

둘째, 소규모 데이터 세트의 경우 네트워크가 ‘콜드’ FC 시작에서 ‘학습’을 시작하도록 하는 것이 어려울 수 있습니다. 이것이 바로 네트워크 바디를 먼저 동결하는 이유입니다. 그럼에도 불구하고 워밍업 단계를 통과하는 것은 약간의 도전이 될 수 있으며 SGD 이외의 옵티 마이저를 사용해야 할 수도 있습니다 (27 장 참조). 미세 조정에는 약간의 노력이 필요하지만 올바르게 수행하면 거의 항상 더 높은 정확도를 만들 수 있습니다.