상세 컨텐츠

본문 제목

AI 전이 학습을 통한 꽃 이미지 분류하기

카테고리 없음

by 심장과영혼 2021. 5. 15. 16:24

본문

728x90
반응형

전이 학습을 통한 꽃 이미지 분류

이제 전이 학습을 적용하여 자신의 CNN을 만들어 꽃 이미지를 분류 할 차례입니다.이번에는 TensorFlow 데이터 세트를 사용하여 직접 Flowers 데이터 세트를 다운로드하고 이를 학습 및 검증 세트로 분할해야합니다.

TensorFlow Hub

TensorFlow Hub는 사용할 수 있는 이미 훈련된 TensorFlow 모델의 온라인 리포지토리입니다. 이러한 모델은 있는 그대로 사용하거나 전이 학습에 사용할 수 있습니다.

전이 학습은 기존의 훈련된 모델을 취하여 이를 확장하여 추가 작업을 수행하는 과정입니다. 여기에는 가능한 다른 출력을 얻기 위해 최종 레이어를 추가 및 재교육하는 동안 모델의 대부분을 변경하지 않고 그대로 두는 것이 포함됩니다.

여기에서 TensorFlow Module Hub에서 사용 가능한 모든 모델을 볼 수 있습니다.

Imports

전에 본 적이 있는 정상적인 IMPORT 구문들입니다. 새로운 것은 텐서플로우_허브를 가져오는 것이다.

import tensorflow as tf

import numpy as np

import matplotlib.pyplot as plt

 

import tensorflow_hub as hub

import tensorflow_datasets as tfds

 

from tensorflow.keras import layers

import logging

logger = tf.get_logger()

logger.setLevel(logging.ERROR)

TODO: Download the Flowers Dataset using TensorFlow Datasets

아래 셀에서 TensorFlow 데이터 세트를 사용하여 Flowers 데이터 세트를 다운로드합니다. TensorFlow 데이터 세트 설명서를 보면 Flowers 데이터 세트의 이름이 tf_flowers라는 것을 알 수 있습니다. 또한 이 데이터 집합은 교육 집합으로만 분할되어 있습니다. 따라서 tfds.splits를 사용하여 이 교육 세트를 training_set 및 validation_set으로 분할해야 합니다. [70, 30] 분할을 수행하여 training_set에 70, validation_set에 30이 일치하도록 한다. 그런 다음 tfds.load를 사용하여 tf_flower 데이터 집합을 로드합니다. tfds.load 함수는 필요한 모든 매개 변수를 사용하고 데이터셋에 대한 정보를 검색할 수 있도록 데이터셋 정보를 반환하는지 확인합니다.

(training_set, validation_set), dataset_info = tfds.load(

'tf_flowers',

split=['train[:70%]', 'train[70%:]'],

with_info=True,

as_supervised=True,

)

실행결과

TODO: Print Information about the Flowers Dataset

이제 데이터 세트를 다운로드했으므로 데이터 세트 정보를 사용하여 데이터 세트의 클래스 수를 인쇄하고 교육 및 검증 세트에 있는 이미지 수를 계산하는 코드도 작성합니다.

num_classes = dataset_info.features['label'].num_classes

 

num_training_examples = 0

num_validation_examples = 0

 

for example in training_set:

num_training_examples += 1

 

for example in validation_set:

num_validation_examples += 1

 

print('Total Number of Classes: {}'.format(num_classes))

print('Total Number of Training Images: {}'.format(num_training_examples))

print('Total Number of Validation Images: {} \n'.format(num_validation_examples))

실행 결과

Flowers(꽃) 데이터 집합의 이미지 크기가 모두 같지는 않습니다.

for i, example in enumerate(training_set.take(5)):

print('Image {} shape: {} label: {}'.format(i+1, example[0].shape, example[1]))

실행 결과

TODO: Reformat Images and Create Batches

아래 셀에서 MobileNet v2(224, 224)가 예상하는 해상도로 모든 이미지를 재포맷하고 정상화하는 기능을 만듭니다. 함수는 이미지와 레이블을 인수로서 받아들여야 하며 새 이미지와 해당 레이블을 반환해야 합니다. 그런 다음 크기 32의 학습 및 검증 배치를 작성합니다.

IMAGE_RES = 224

 

def format_image(image, label):

image = tf.image.resize(image, (IMAGE_RES, IMAGE_RES))/255.0

return image, label

 

BATCH_SIZE = 32

 

train_batches = training_set.shuffle(num_training_examples//4).map(format_image).batch(BATCH_SIZE).prefetch(1)

 

validation_batches = validation_set.map(format_image).batch(BATCH_SIZE).prefetch(1)

Do Simple Transfer Learning with TensorFlow Hub

이제 TensorFlow Hub를 사용하여 전이 학습을 수행하겠습니다. 전송 학습에서 우리는 이미 훈련된 모델의 일부를 재사용하고 모델의 최종 계층 또는 여러 계층을 변경한 다음 우리 자신의 데이터 세트에서 해당 계층을 재교육합니다.

TODO: Create a Feature Extractor

아래 셀에서 MobileNet v2를 사용하여 feature_extrator를 만듭니다. TensorFlow Hub(최종 분류 계층이 없는)의 부분 모델을 형상 벡터라고 한다. TensorFlow Hub 문서(https://tfhub.dev/s?module-type=image-feature-vector&q=tf2

 

tf2 | TensorFlow Hub

Items per page: 100 0 of 0

tfhub.dev

) 로 이동하여 사용 가능한 형상 벡터 목록을 확인합니다.

tf2-preview/mobilenet_v2/feature_vector를 클릭합니다. 설명서를 읽고 해당하는 URL을 가져와 MobileNet v2 기능 벡터를 가져옵니다. 마지막으로, 허브를 사용하여 feature_extractor를 생성한다.올바른 input_shape 매개 변수를 가진 KerasLayer입니다.

아래 셀에서 MobileNet v2를 사용하여 feature_extrator를 만듭니다. TensorFlow Hub(최종 분류 계층이 없는)의 부분 모델을 형상 벡터라고 한다. TensorFlow Hub 문서로 이동하여 사용 가능한 형상 벡터 목록을 확인합니다. tf2-preview/mobilenet_v2/feature_vector를 클릭합니다. 설명서를 읽고 해당하는 URL을 가져와 MobileNet v2 기능 벡터를 가져옵니다. 마지막으로, 허브를 사용하여 feature_extractor를 생성한다.올바른 input_shape 매개 변수를 가진 KerasLayer입니다.

URL = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4"

feature_extractor = hub.KerasLayer(URL,

input_shape=(IMAGE_RES, IMAGE_RES, 3))

(이 구문은 수행하는데 조금 시간이 걸립니다.)

TODO: Freeze the Pre-Trained Model

아래의 셀에서 형상 추출기 계층의 변수를 동결하여 훈련은 최종 분류기 계층만 수정한다.

feature_extractor.trainable = False

TODO: Attach a classification head

아래 셀에 tf.keras.Sequential 모델을 만듭니다.사전 학습된 모델과 새 분류 계층을 추가합니다. 분류 계층에는 Flowers 데이터 집합과 동일한 수의 클래스가 있어야 합니다. 마지막으로 순차적 모델의 요약을 인쇄합니다.

model = tf.keras.Sequential([

feature_extractor,

layers.Dense(num_classes)

])

 

model.summary()

실행결과

TODO: Train the model

아래의 셀에서 이 모델을 다른 모델과 마찬가지로 컴파일을 호출한 다음 장착합니다. 두 방법을 모두 적용할 때 적절한 매개 변수를 사용해야 합니다. 모델을 6 번 동안 훈련하십시오.

model.compile(

optimizer='adam',

loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),

metrics=['accuracy'])

 

EPOCHS = 6

 

history = model.fit(train_batches,

epochs=EPOCHS,

validation_data=validation_batches)

실행결과

6번의 학습만으로 최대 88%의 검증 정확도를 얻을 수 있습니다. 이는 정말 대단한 일입니다. 이는 80번의 교육으로 76%의 정확도를 얻을 수 있었던 이전 수업에서 만든 모델에 비해 크게 개선된 것입니다. 이러한 차이점의 이유는 MobileNet v2가 오랜 시간에 걸쳐 전문가들에 의해 신중하게 설계된 후 대규모 데이터 세트(ImageNet)에 대한 교육을 받았기 때문입니다.

TODO: Plot Training and Validation Graphs

아래 셀에 교육 및 검증 정확도/손실 그래프를 표시합니다.

acc = history.history['accuracy']

val_acc = history.history['val_accuracy']

 

loss = history.history['loss']

val_loss = history.history['val_loss']

 

epochs_range = range(EPOCHS)

 

plt.figure(figsize=(8, 8))

plt.subplot(1, 2, 1)

plt.plot(epochs_range, acc, label='Training Accuracy')

plt.plot(epochs_range, val_acc, label='Validation Accuracy')

plt.legend(loc='lower right')

plt.title('Training and Validation Accuracy')

 

plt.subplot(1, 2, 2)

plt.plot(epochs_range, loss, label='Training Loss')

plt.plot(epochs_range, val_loss, label='Validation Loss')

plt.legend(loc='upper right')

plt.title('Training and Validation Loss')

plt.show()

여기서 좀 궁금한 것은 실행 시작부터 종료까지 검증 성능이 학습 성과보다 낫다는 점입니다.

그 한 가지 이유는 검증 성능이 이 시기의 끝에서 측정되지만 훈련 성능은 이 시기의 평균값이기 때문이다.

하지만 더 큰 이유는 이미 Flower 이미지에 대해 학습을 받은 MobileNet의 많은 부분을 재사용하고 있기 때문입니다.

TODO: Check Predictions

아래 셀에서 데이터 집합 정보에서 레이블 이름을 가져와 NumPy 배열로 변환합니다. 배열을 인쇄하여 레이블 이름이 올바른지 확인합니다.

class_names = np.array(dataset_info.features['label'].names)

 

print(class_names)

TODO: Create an Image Batch and Make Predictions

아래 셀에서 next() 함수를 사용하여 image_batch 및 해당 label_batch를 생성합니다. .numpy() 방법을 사용하여 image_batch와 label_batch를 모두 numpy 어레이로 변환합니다. 그런 다음 .precast() 방법을 사용하여 이미지 배치를 모형에서 실행하고 예측을 수행합니다. 그런 다음 np.argmax() 함수를 사용하여 각 이미지에 대한 최상의 예측 지수를 얻습니다. 마지막으로 최상의 예측의 인덱스를 클래스 이름으로 변환합니다.

image_batch, label_batch = next(iter(train_batches))

 

 

image_batch = image_batch.numpy()

label_batch = label_batch.numpy()

 

predicted_batch = model.predict(image_batch)

predicted_batch = tf.squeeze(predicted_batch).numpy()

 

predicted_ids = np.argmax(predicted_batch, axis=-1)

predicted_class_names = class_names[predicted_ids]

 

print(predicted_class_names)

TODO: Print True Labels and Predicted Indices

아래 셀에서 실제 레이블과 예측 레이블의 인덱스를 인쇄하십시오.

print("Labels: ", label_batch)

print("Predicted labels: ", predicted_ids)

Plot Model Predictions

plt.figure(figsize=(10,9))

for n in range(30):

plt.subplot(6,5,n+1)

plt.subplots_adjust(hspace = 0.3)

plt.imshow(image_batch[n])

color = "blue" if predicted_ids[n] == label_batch[n] else "red"

plt.title(predicted_class_names[n].title(), color=color)

plt.axis('off')

_ = plt.suptitle("Model predictions (blue: correct, red: incorrect)")

TODO: Perform Transfer Learning with the Inception Model

TensorFlow Hub 문서로 이동하여 tf2-preview/inception_v3/feature_vector를 클릭합니다. 이 특징 벡터는 Inception v3 모델에 해당합니다. 아래 셀에서 전송 학습을 사용하여 꽃 데이터 세트에서 이미지를 분류하기 위해 사전 교육 모델로 인셉션 v3을 사용하는 CNN을 만드십시오. Inception은 299 x 299 픽셀의 영상을 입력으로 받아들입니다. Inception v3의 정확성과 MobileNet v2의 정확성을 비교합니다.

IMAGE_RES = 299

 

(training_set, validation_set), dataset_info = tfds.load(

'tf_flowers',

with_info=True,

as_supervised=True,

split=['train[:70%]', 'train[70%:]'],

)

train_batches = training_set.shuffle(num_training_examples//4).map(format_image).batch(BATCH_SIZE).prefetch(1)

validation_batches = validation_set.map(format_image).batch(BATCH_SIZE).prefetch(1)

 

URL = "https://tfhub.dev/google/tf2-preview/inception_v3/feature_vector/4"

feature_extractor = hub.KerasLayer(URL,

input_shape=(IMAGE_RES, IMAGE_RES, 3),

trainable=False)

 

model_inception = tf.keras.Sequential([

feature_extractor,

tf.keras.layers.Dense(num_classes)

])

 

model_inception.summary()

model_inception.compile(

optimizer='adam',

loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),

metrics=['accuracy'])

 

EPOCHS = 6

 

history = model_inception.fit(train_batches,

epochs=EPOCHS,

validation_data=validation_batches)

실행결과


요약

우리는 전이 학습을 사용하여 아주 적은 노력으로 매우 강력한 컨볼루션 신경망을 만드는 방법을 배웠습니다. 이 강의의 주요 요점은 다음과 같습니다.

전이 학습 : 기계 학습 전문가가 생성하고 이미 대규모 데이터 세트에서 학습 된 모델을 재사용하는 기술입니다. 전이 학습을 수행 할 때 항상 사전 훈련 된 모델의 마지막 계층을 변경하여 작업중인 데이터 세트에있는 클래스 수와 동일하도록해야합니다.

고정 매개 변수 : 사전 훈련 된 모델의 변수를 훈련 불가능으로 설정합니다. 매개 변수를 고정하면 마지막 분류 계층의 변수 만 학습되고 사전 학습 된 모델의 다른 계층의 변수는 동일하게 유지됩니다.

MobileNet : Google에서 개발 한 최첨단 컨볼 루션 신경망으로, 높은 수준의 정확도를 유지하면서 필요한 메모리와 계산 리소스의 양을 최소화하는 매우 효율적인 신경망 아키텍처를 사용합니다. MobileNet은 메모리와 계산 리소스가 제한된 모바일 장치에 이상적입니다.

또한 전이 학습을 사용하여 MobileNet을 사용하여 개와 고양이의 이미지를 분류하는 Convolutional Neural Network를 만들었습니다. 전이 학습이 Dogs and Cats 데이터 세트에서 달성 된 정확도를 크게 향상시키는 것을 확인할 수있었습니다. 연습으로이 강의에서 배운 모든 것을 적용하여 MobileNet을 사용하여 꽃 이미지를 분류하는 자신 만의 CNN을 만들 수있었습니다.


이 글은 아래에 있는 영문 내용을 번역하고 수행결과를 함께 기록하였습니다.

https://classroom.udacity.com/courses/ud187/lessons/a915f824-ce4a-4f5e-9897-a78ccbff313d/concepts/e49c1b5c-b005-44d1-9e7a-b55ef7f29b72

 

Udacity

classroom.udacity.com

728x90
반응형