본문 바로가기
DNN with Keras/Transfer Learning

Keras Transfer Learning for Computer Vision

by goatlab 2024. 2. 13.
728x90
반응형
SMALL

Keras Transfer Learning for Computer Vision

 

Keras용으로 널리 사용되는 몇 가지 사전 훈련된 신경망을 살펴 본다. 특히, 다음 두 사이트는 프로젝트에 사용할 사전 학습된 모델을 찾는 데 좋은 출발점이 될 수 있다.

 

TensorFlow Model Zoo

Papers with Code

 

Keras에는 사전 학습된 여러 모델에 대한 기본 지원이 포함되어 있다.

 

The Kaggle Cats vs. Dogs Dataset

 

컴퓨터 비전을 위해 사전 학습된 모델을 얻고 출력 레이어만 학습하는 방법이 존재한다. 또한, 출력 레이어를 훈련한 후에는 낮은 학습률을 적용하여 모든 가중치를 훈련함으로써 전체 네트워크를 미세 조정한다.

 

고양이와 개 데이터 세트는 고전적인 Kaggle 대회에서 가져온 것이다. 먼저, Keras에서 이 데이터 세트를 다운로드한다. 높은 정확도를 달성하기 위해 전체 데이터 세트가 필요한 것은 아니다. 일부를 사용하면 학습 속도도 빨라진다. 원본 훈련 데이터의 40%(25,000개 이미지)를 훈련에 사용하고 10%를 검증에 사용한다.

 

개와 고양이 데이터 세트는 비교적 크기가 커서 Colab과 같은 12GB 미만의 시스템에는 쉽게 맞지 않다. 이 메모리 크기 때문에 데이터를 처리하기 위해 추가 단계를 수행해야 한다. 데이터 집합을 Numpy 배열로 로드하는 대신 prefetched 데이터 집합으로 로드하여 현재 필요한 데이터 집합 부분만 RAM에 있도록 한다. 데이터 집합 전체를 Numpy 배열로 로드하려면 아래 load 명령에 batch_size=-1 옵션을 추가한다.

 

import tensorflow_datasets as tfds
import tensorflow as tf

tfds.disable_progress_bar()
train_ds, validation_ds = tfds.load("cats_vs_dogs",
    split=["train[:40%]", "train[40%:50%]"],
    as_supervised=True, # 레이블 포함
)

num_train = tf.data.experimental.cardinality(train_ds)
num_test = tf.data.experimental.cardinality(validation_ds)

print(f"훈련 샘플 수: {num_train}")
print(f"검증 샘플 수: {num_test}")
훈련 샘플 수: 9305
검증 샘플 수: 2326

 

먼저, 이 데이터 세트의 이미지 몇 개를 표시한다. 레이블은 각 이미지 위에 있다. 1은 개를 나타내고 0은 고양이를 나타낸다.

 

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 10))
for i, (image, label) in enumerate(train_ds.take(9)):
    ax = plt.subplot(3, 3, i + 1)
    plt.imshow(image)
    plt.title(int(label))
    plt.axis("off")

 

위의 이미지를 살펴보면 또 다른 문제가 분명해진다. 이미지의 크기가 다양하다는 것이다. 다음 코드를 사용하여 모든 이미지를 150x150으로 표준화한다.

 

size = (150, 150)
train_ds = train_ds.map(lambda x, y: (tf.image.resize(x, size), y))
validation_ds = validation_ds.map(lambda x, y: (tf.image.resize(x, size), y))

 

데이터를 일괄 처리하고 캐싱 및 프리페칭을 사용하여 로딩 속도를 최적화한다.

 

batch_size = 32
train_ds = train_ds.cache().batch(batch_size).prefetch(buffer_size=10)
validation_ds = validation_ds.cache().batch(batch_size).prefetch(buffer_size=10)

 

증강은 학습 데이터의 이미지를 변경하여 모델에서 사용할 수 있는 학습 데이터의 양을 늘리는 강력한 컴퓨터 비전 기술이다. 증강을 사용하기 위해 이미지의 수평 뒤집기를 허용한다. 실제 세계에서 고양이와 개는 수직으로 뒤집는 것보다 수평으로 뒤집는 것이 훨씬 더 의미가 있다.

 

from tensorflow import keras
from tensorflow.keras import layers

data_augmentation = keras.Sequential([
    layers.RandomFlip("horizontal"),
    layers.RandomRotation(0.1),
])

 

다음 코드를 통해 증강을 시각화할 수 있다.

 

import numpy as np

for images, labels in train_ds.take(1):
    plt.figure(figsize=(10, 10))
    first_image = images[0]
    
    for i in range(9):
        ax = plt.subplot(3, 3, i + 1)
        augmented_image = data_augmentation(
            tf.expand_dims(first_image, 0), training=True
        )
        plt.imshow(augmented_image[0].numpy().astype("int32"))
        plt.title(int(labels[0]))
        plt.axis("off")

728x90
반응형
LIST

'DNN with Keras > Transfer Learning' 카테고리의 다른 글

조기 중지의 이점  (0) 2024.02.13
Transfer Learning for NLP with Keras  (0) 2024.02.13
네트워크 생성 및 가중치 전송  (0) 2024.02.13
회귀 네트워크 전송  (0) 2024.02.13
전이 학습 (Transfer Learning)  (0) 2024.02.13