Path: blob/master/site/ko/tutorials/images/classification.ipynb
25118 views
Copyright 2018 The TensorFlow Authors.
이미지 분류
이 튜토리얼은 tf.keras.Sequential
모델을 사용하여 꽃 이미지를 분류하고 tf.keras.utils.image_dataset_from_directory
를 사용하여 데이터를 로드하는 방법을 보여줍니다. 다음 개념을 설명합니다.
디스크에서 데이터세트를 효율적으로 로드합니다.
데이터 증강 및 드롭아웃을 포함하여 과대적합을 식별하고 이를 완화하는 기술을 적용합니다.
이 튜토리얼은 기본적인 머신러닝 워크플로를 따릅니다.
데이터 검사 및 이해하기
입력 파이프라인 빌드하기
모델 빌드하기
모델 훈련하기
모델 테스트하기
모델을 개선하고 프로세스 반복하기
또한 이 노트북은 모바일, 임베디드 및 IoT 장치에서 온디바이스 머신 러닝을 위해 저장된 모델을 TensorFlow Lite 모델로 변환하는 방법을 보여줍니다.
설정
TensorFlow 및 기타 필요한 라이브러리를 가져옵니다.
데이터세트 다운로드 및 탐색하기
이 튜토리얼에서는 약 3,700장의 꽃 사진 데이터세트를 사용합니다. 데이터세트에는 클래스당 하나씩 5개의 하위 디렉터리가 있습니다.
다운로드 후, 데이터세트 사본을 사용할 수 있습니다. 총 3,670개의 이미지가 있습니다.
장미의 경우는 다음과 같습니다.
그리고 일부 튤립이 있습니다.
Keras 유틸리티를 사용하여 데이터 로드하기
다음으로, 유용한 tf.keras.utils.image_dataset_from_directory
유틸리티를 사용하여 디스크에서 이러한 이미지를 로드해 보겠습니다. 이러면 몇 줄의 코드로 디스크의 이미지 디렉터리에서 tf.data.Dataset
로 이동하게 됩니다. 원하는 경우 이미지 로드 및 전처리 튜토리얼을 방문하여 처음부터 자체 데이터 로드 코드를 작성할 수도 있습니다.
데이터세트 만들기
로더에 대한 몇 가지 매개변수를 정의합니다.
모델을 개발할 때 검증 분할을 사용하는 것이 좋습니다. 이미지의 80%를 훈련에 사용하고 20%를 검증에 사용합니다.
이러한 데이터세트의 class_names
속성에서 클래스 이름을 찾을 수 있습니다. 이들 클래스 이름은 알파벳 순서의 디렉토리 이름에 해당합니다.
데이터 시각화하기
다음은 훈련 데이터세트의 처음 9개 이미지입니다.
이 튜토리얼의 뒷부분에서 훈련을 위해 이러한 데이터세트를 Model.fit
메서드에 전달합니다. 원하는 경우 데이터세트를 수동으로 반복하고 이미지 배치를 가져올 수도 있습니다.
image_batch
는 (32, 180, 180, 3)
형상의 텐서이며, 180x180x3
형상의 32개 이미지 묶음으로 되어 있습니다(마지막 차원은 색상 채널 RGB를 나타냄). label_batch
는 형상 (32,)
의 텐서이며 32개 이미지에 해당하는 레이블입니다.
image_batch
및 labels_batch
텐서에서 .numpy()
를 호출하여 이를 numpy.ndarray
로 변환할 수 있습니다.
성능을 높이도록 데이터세트 구성하기
버퍼링된 프리페치를 사용하여 I/O를 차단하지 않고 디스크에서 데이터를 생성할 수 있도록 하겠습니다. 데이터를 로드할 때 다음 두 가지 중요한 메서드를 사용해야 합니다.
Dataset.cache()
는 첫 epoch 동안 디스크에서 이미지를 로드한 후 이미지를 메모리에 유지합니다. 이렇게 하면 모델을 훈련하는 동안 데이터세트가 병목 상태가 되지 않습니다. 데이터세트가 너무 커서 메모리에 맞지 않는 경우, 이 메서드를 사용하여 성능이 높은 온디스크 캐시를 생성할 수도 있습니다.Dataset.prefetch
는 훈련하는 동안 데이터 전처리 및 모델 실행을 중첩시킵니다.
관심 있는 독자는 tf.data API를 통한 성능 향상 가이드의 프리페치 섹션에서 두 가지 메서드와 데이터를 디스크에 캐시하는 방법에 대해 자세히 알아볼 수 있습니다.
데이터 표준화하기
RGB 채널 값은 [0, 255]
범위에 있습니다. 이것은 신경망에 이상적이지 않습니다. 일반적으로 입력 값을 작게 만들어야 합니다.
여기에서 tf.keras.layers.Rescaling
을 사용하여 값을 [0, 1]
범위로 표준화합니다.
이 레이어를 사용하는 방법에는 두 가지가 있습니다. Dataset.map
을 호출하여 데이터세트에 이를 적용할 수 있습니다.
또는 모델 정의 내부에 레이어를 포함하여 배포를 단순화할 수 있습니다. 여기에서는 두 번째 접근 방식을 사용합니다.
참고: 이전에 tf.keras.utils.image_dataset_from_directory
의 image_size
인수를 사용하여 이미지 크기를 조정했습니다. 해당 모델에도 크기 조정 논리를 포함하려면 tf.keras.layers.Resizing
레이어를 사용할 수 있습니다.
기본 Keras 모델
모델 만들기
Keras 순차형 모델은 각각에 최대 풀링 레이어(tf.keras.layers.MaxPooling2D
)가 있는 3개의 컨볼루션 블록(tf.keras.layers.Conv2D
)으로 구성됩니다. ReLU 활성화 함수('relu'
)에 의해 활성화되는 128개 유닛이 있는 완전 연결된 레이어(tf.keras.layers.Dense
)가 있습니다. 이 모델은 높은 정확도를 발휘하도록 조정되지 않았습니다. 이 튜토리얼의 목표는 표준 접근 방식을 보여주는 것입니다.
모델 컴파일하기
이 튜토리얼에서는 tf.keras.optimizers.Adam
옵티마이저와 tf.keras.losses.SparseCategoricalCrossentropy
손실 함수를 선택합니다. 각 훈련 epoch에 대한 훈련 및 검증 정확도를 보려면 metrics
인수를 Model.compile
에 전달합니다.
모델 요약
Keras Model.summary
메서드를 사용하여 네트워크의 모든 레이어를 봅니다.
모델 훈련하기
Keras Model.fit
메서드를 사용하여 10 epoch 동안 모델을 훈련합니다.
훈련 결과 시각화하기
훈련 및 검증 세트에 대한 손실과 정확성 플롯을 생성합니다.
플롯은 훈련 정확도와 검증 정확도가 큰 차이로 떨어져 있으며 모델은 검증 세트에서 약 60%의 정확도만을 달성했음을 보여줍니다.
다음 튜토리얼 섹션에서는 무엇이 잘못되었는지 검사하고 모델의 전체 성능을 높이는 방법을 보여줍니다.
과대적합
위의 플롯에서 훈련 정확성은 시간이 지남에 따라 선형적으로 증가하는 반면, 검증 정확성은 훈련 과정에서 약 60%를 벗어나지 못합니다. 또한 훈련 정확성과 검증 정확성 간의 정확성 차이가 상당한데, 이는 과대적합의 징후입니다.
훈련 예제가 적을 때 모델은 새로운 예제에서 모델의 성능에 부정적인 영향을 미치는 정도까지 훈련 예제의 노이즈나 원치 않는 세부까지 학습합니다. 이 현상을 과대적합이라고 합니다. 이는 모델이 새 데이터세트에서 일반화하는 데 어려움이 있음을 의미합니다.
훈련 과정에서 과대적합을 막는 여러 가지 방법들이 있습니다. 이 튜토리얼에서는 데이터 증강을 사용하고 모델에 드롭아웃을 추가합니다.
데이터 증강
과대적합은 일반적으로 훈련 예제가 적을 때 발생합니다. 데이터 증강은 증강한 다음 믿을 수 있는 이미지를 생성하는 임의 변환을 사용하는 방법으로 기존 예제에서 추가 훈련 데이터를 생성하는 접근법을 취합니다. 그러면 모델이 데이터의 더 많은 측면을 파악하게 되므로 일반화가 더 쉬워집니다.
Keras 전처리 레이어 tf.keras.layers.RandomFlip
, tf.keras.layers.RandomRotation
, tf.keras.layers.RandomZoom
을 사용하여 데이터 증강을 구현합니다. 다른 레이어처럼 이를 모델 내부에 포함시키고 GPU에서 실행할 수 있습니다.
동일한 이미지에 데이터 증강을 여러 번 적용하여 몇 가지 증강 예제를 시각화합니다.
다음 단계에서 훈련하기 전에 모델에 데이터 증강을 추가합니다.
드롭아웃
과대적합을 줄이는 또 다른 기술은 네트워크에 dropout{:.external} 정규화를 도입하는 것입니다.
드롭아웃을 레이어에 적용하면, 훈련 프로세스 중에 레이어에서 여러 출력 단위가 무작위로 드롭아웃됩니다(활성화를 0으로 설정). 드롭아웃은 0.1, 0.2, 0.4 등의 형식으로 소수를 입력 값으로 사용합니다. 이는 적용된 레이어에서 출력 단위의 10%, 20% 또는 40%를 임의로 제거하는 것을 의미합니다.
증강 이미지를 사용하여 훈련하기 전에 tf.keras.layers.Dropout
을 사용하여 새로운 신경망을 생성합니다.
모델 컴파일 및 훈련하기
훈련 결과 시각화하기
데이터 증강 및 tf.keras.layers.Dropout
적용 후 이전보다 과대적합이 적고 훈련 및 검증 정확도가 더 밀접하게 정렬됩니다.
새로운 데이터로 예측하기
모델을 사용하여 훈련 또는 검증 세트에 포함되지 않은 이미지를 분류합니다.
참고: 데이터 증강 및 드롭아웃 레이어는 추론 시 비활성화됩니다.
TensorFlow Lite 사용하기
TensorFlow Lite는 개발자가 모바일, 임베디드 및 엣지 기기에서 모델을 실행할 수 있도록 도와주어 온디바이스 머신 러닝을 지원하는 도구 세트입니다.
Keras 순차형 모델을 TensorFlow Lite 모델로 변환하기
훈련된 모델을 온디바이스 애플리케이션에 사용하려면 먼저 TensorFlow Lite 모델이라는 더 작고 효율적인 모델 형식으로 이를 변환해야 합니다.
이 예제에서는 tf.lite.TFLiteConverter.from_keras_model
을 사용하여 훈련된 Keras 순차형 모델로부터 TensorFlow Lite 모델을 생성합니다.
이전 단계에서 저장한 TensorFlow Lite 모델에는 여러 함수 서명이 포함될 수 있습니다. Keras 모델 변환기 API는 기본 서명을 자동으로 사용합니다. TensorFlow Lite 서명에 대해 자세히 알아보세요.
TensorFlow Lite 모델 실행하기
tf.lite.Interpreter
클래스를 통해 Python에서 TensorFlow Lite의 저장된 모델 서명에 액세스할 수 있습니다.
Interpreter
로 모델을 로드합니다.
변환된 모델의 서명을 인쇄하여 입력(및 출력)의 이름을 얻습니다.
이 예에는 serving_default
라는 기본 서명이 하나 있습니다. 또한 'inputs'
의 이름은 'sequential_1_input'
이고 'outputs'
의 이름은 'outputs'
입니다. 이 튜토리얼의 앞부분에서 설명한 것처럼 Model.summary
를 실행할 때 이러한 첫 번째 및 마지막 Keras 레이어 이름을 조회할 수 있습니다.
이제 다음과 같이 서명 이름을 전달하여 tf.lite.Interpreter.get_signature_runner
로 샘플 이미지에 대한 추론을 수행하여 로드된 TensorFlow 모델을 테스트할 수 있습니다.
튜토리얼의 앞부분에서 수행한 것과 마찬가지로 TensorFlow Lite 모델을 사용하여 훈련 또는 검증 세트에 포함되지 않은 이미지를 분류할 수 있습니다.
이미 해당 이미지를 텐서화하고 img_array
로 저장했습니다. 이제 로드된 TensorFlow Lite 모델(predictions_lite
)의 첫 번째 인수('inputs'
의 이름)에 이를 전달하고 softmax 활성화를 계산한 다음, 계산된 확률이 가장 높은 클래스에 대한 예측을 인쇄합니다.
Lite 모델에서 생성된 예측은 원래 모델에서 생성된 예측과 거의 동일해야 합니다.
5가지 클래스 'daisy'
, 'dandelion'
, 'roses'
, 'sunflowers'
및 'tulips'
중에서 모델은 이미지가 해바라기에 속하는 것으로 예측해야 하며, 이는 TensorFlow Lite 변환 이전과 동일한 결과입니다.