엔비디아 딥러닝 기초 과정을 수료하기 위한 문제를 해결해보고자 한다.

 

문제는 신선한 과일과 썩은 과일을 인식할 수 있는 모델을 훈련을 통해 92% 이상의 정확도를 달성하는 것이다.

 

이를 위해 전이 학습과 데이터 증강 파인 튜닝을 사용해야 하며, 데이터 세트는 Kaggle에서 다운로드할 수 있다.

 

모델의 출력 레이어는 6개의 뉴런으로 구성해야 하며, categorical_crossentropy 손실 함수를 사용하여 모델을 컴파일해야 한다.

 

 


 

 

모델 불러오기

 

from tensorflow import keras

base_model = keras.applications.VGG16(
    weights='imagenet',
    input_shape=(224, 224, 3),
    include_top=False)

 

이 코드는 TensorFlow와 Keras 라이브러리를 사용하여 VGG16 모델을 불러오는 코드이다.

 

ImageNet 데이터셋으로 사전 학습된 가중치를 사용하였으며, 입력 데이터의 형태 설정 및 VGG16 모델의 최상위 완전 연결 층을 포함하지 않도록 설정하였다.

 

 

 

기본 모델 동결

 

# Freeze base model
base_model.trainable = False

 

위 코드는 가중치를 고정하여 학습되지 않도록 설정하는 부분이다.

 

전이 학습에서 자주 사용되며, 사전 학습된 모델의 가중치를 그대로 유지하면서, 추가로 쌓는 사용자 정의 층만 학습할 수 있도록 한다.

 

 

 

모델 레이어 추가

 

# Create inputs with correct shape
# 정확한 shape를 넣어야 한다. (224x224크기의 rgb(3)값)
inputs = keras.Input(shape=(224, 224, 3))

x = base_model(inputs, training=False)

# Add pooling layer or flatten layer
x = keras.layers.GlobalAveragePooling2D()(x)

# Add final dense layer
outputs = keras.layers.Dense(6, activation = 'softmax')(x) # 정상과일 3개, 썩은과일 3개 = 6개

# Combine inputs and outputs to create model
model = keras.Model(inputs, outputs)

# 모델 확인
model.summary()

 

모델의 각 층들을 추가하였다.

 

확인한 모델의 모습은 아래와 같다.

 

sumary()로 확인한 모델의 모습

 

 

 

모델 컴파일 및 데이터 증강

 

# 모델 컴파일
model.compile(loss = keras.losses.CategoricalCrossentropy(from_logits=True), 
	metrics = [keras.metrics.CategoricalAccuracy()])

# 데이터 증강
from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
    rotation_range=180,  # randomly rotate images in the range (degrees, 0 to 180)
    zoom_range = 0.1, # Randomly zoom image 
    width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
    height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
    horizontal_flip=True,  # randomly flip images
    vertical_flip=True)

 

해당 과정은 모델을 컴파일 후 데이터를 증강하는 과정이다.

 

데이터 증강 과정은 반드시 필요한 과정은 아니지만 해당 과정을 통해 모델의 정확돌르 92% 이상까지 올릴 수 있다.

 

 

 

데이터셋 로드

 

# load and iterate training dataset
train_it = datagen.flow_from_directory('data/fruits/train/', 
                                       target_size=(224,224), 
                                       color_mode='rgb', 
                                       class_mode="categorical")
# load and iterate validation dataset
valid_it = datagen.flow_from_directory('data/fruits/valid/', 
                                      target_size=(224,224), 
                                      color_mode='rgb', 
                                      class_mode="categorical")

 

ImageDataGenerator를 사용하여 훈련 및 검증 데이터셋을 로드하고 반복하는 부분이다.

 

이미지를 실시간으로 로드하고, 모델 학습 중에 사용할 수 있도록 전처리하는 과정이다. 

 

flow_from_directory 메서드를 사용하여 데이터 증강과 배치 처리가 자동으로 이루어진다.

 

 

 

모델 훈련하기

 

model.fit(train_it,
          validation_data=valid_it,
          steps_per_epoch=train_it.samples/train_it.batch_size,
          validation_steps=valid_it.samples/valid_it.batch_size,
          epochs=20)

 

모델을 훈련하기 위한 코드이다.

 

에포크는 20으로 설정하였다.

 

 

학습된 정확도는 목표했던 92%와는 거리가 멀어보인다.

 

 

 

파인튜닝

 

# Unfreeze the base model
base_model.trainable = True

# Compile the model with a low learning rate
model.compile(optimizer=keras.optimizers.RMSprop(learning_rate = .00001),
              loss = keras.losses.CategoricalCrossentropy() , 
              metrics = [keras.metrics.CategoricalAccuracy()])

# 재훈련
model.fit(train_it,
          validation_data=valid_it,
          steps_per_epoch=train_it.samples/train_it.batch_size,
          validation_steps=valid_it.samples/valid_it.batch_size,
          epochs=5)

 

파인 튜닝은 전이 학습의 한 방법으로, 사전 학습된 모델의 일부 가중치를 다시 학습시켜 특정 작업에 맞춤화하는 과정이다.

 

위 과정을 통해 정확도를 92% 이상으로 끌어올리려고 한다.

파인튜닝 후 정확도

 

파인튜닝을 통해 모델의 정확도를 96%까지 끌어올릴 수 있게 되었다.