엔비디아 딥러닝 기초 과정을 수료하기 위한 문제를 해결해보고자 한다.
문제는 신선한 과일과 썩은 과일을 인식할 수 있는 모델을 훈련을 통해 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()
모델의 각 층들을 추가하였다.
확인한 모델의 모습은 아래와 같다.
모델 컴파일 및 데이터 증강
# 모델 컴파일
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%까지 끌어올릴 수 있게 되었다.
'Python > 데이터분석(ABC 부트캠프)' 카테고리의 다른 글
[28일차] ABC 부트캠프 / 기술나눔활동 데이터 라벨링 (2) | 2024.08.04 |
---|---|
[27일차] ABC 부트캠프 / NVIDIA 트랜스포머 기반 자연어 처리 애플리케이션 구축 과정 (0) | 2024.08.04 |
[25일차] ABC 부트캠프 / RNN (0) | 2024.07.28 |
[24일차] ABC 부트캠프 / OpenCV 실습 (0) | 2024.07.28 |
[23일차] ABC 부트캠프 / CNN 모델 (0) | 2024.07.28 |