1. 데이터 증강
데이터 증강은 기계 학습, 특히 딥러닝 모델에서 성능을 개선하기 위해 사용되는 기법이다. 데이터 증강은 원본 데이터셋의 크기를 인위적으로 늘리는 방법으로, 데이터가 부족한 상황에서 모델이 더 다양한 데이터를 학습할 수 있도록 돕는다. 이는 모델의 일반화 능력을 향상시키고, 오버피팅을 줄이는 데 중요한 역할을 한다.
이미지 데이터를 포함한 각각의 데이터들을 증강하는 방법은 여러가지가 있지만, 이번 수업에서 배운 이미지 증강에는 아래의 방법이 사용된다.
- 회전 (Rotation): 이미지를 일정 각도만큼 회전시킨다.
- 수평/수직 반전 (Horizontal/Vertical Flip): 이미지를 좌우 또는 상하로 반전시킨다.
- 크기 조절 (Scaling): 이미지를 확대하거나 축소한다.
- 이동 (Translation): 이미지를 좌우 또는 상하로 이동시킨다.
- 자르기 (Cropping): 이미지의 일부를 잘라낸다.
- 노이즈 추가 (Adding Noise): 이미지에 랜덤 노이즈를 추가하여 다양성을 준다.
- 색상 조절 (Color Jittering): 이미지의 밝기, 대비, 채도 등을 조절한다.
머신러닝 모델들은 상하좌우 반전되거나, 회전되는 등의 이미지 변조에 대한 구분을 하지 못하기 때문에 데이터 증강은 모델의 정확성을 높이는 데에 도움이 되는 방법이다. 이미지 데이터의 각도를 조절하거나, 이미지를 상하좌우 반전을 하는 등의 이미지 데이터를 변조함으로써 모델의 정확성을 높인다.
2. 전이 학습
전이 학습은 기본적으로 A 데이터로 학습된 모델을 B 데이터로 예측하는 곳에 적용하는 것을 말한다. A 데이터로 학습한 모델의 일부 레이어만 바꾸어 B 데이터에 적용하여 학습 시간을 줄일 수 있다.
전이 학습을 사용하는 이유는 아래와 같다.
- 학습 시간 단축: 처음부터 모델을 학습시키는 것보다 훨씬 적은 시간으로 학습이 가능하다.
- 더 나은 성능: 적은 데이터로도 기존에 학습된 지식을 활용하여 더 좋은 성능을 얻을 수 있다.
- 적은 데이터 요구: 전이학습은 새로운 작업에서 데이터가 부족한 경우에도 잘 동작한다.
데이터의 개수가 적어 정확도를 올리는 데에 한계가 있는 경우와, 너무 복잡한 모델이기에 학습 시간이 많이 소요되는 경우에 사용된다.
3. 모델 파인튜닝
모델의 파인튜닝은 이전에 학습된모델을 기반으로, 새로운 데이터셋이나 특정 작업에 맞게 모델을 미세하게 조정하고 재학습하는 과정을 말한다. 이 과정은 전이학습의 중요한 부분으로, 기존의 모델이 다른 작업에서 학습한 지식을 활용하면서도 새로운 작업의 특성에 맞게 조정하는 것이 목적이다.
이미 학습이 되어있고, 가중치의 계산이 끝난 모델이기에 파인튜닝을 할 땐 아주 작은 학습률을 가지고 파인튜닝을 진행해야한다. 그렇지 않으면 가중치에 대한 계산을 다시 진행해야한다. 기존의 가중치를 유지하면서 미세하게 작업을 진행한다.
위에서 설명한 전이학습과 모델 파인튜닝의 개념은 다른 것이 많이 없지만 차이점이 존재하긴 한다. 차이점은 아래와 같다.
- 범위:
- 전이학습: 이미 학습된 지식을 다른 작업에 재사용하는 광범위한 개념입니다. Feature Extraction과 Fine-Tuning 모두 전이학습에 포함될 수 있다.
- 파인튜닝: 전이학습의 하위 개념으로, 모델의 가중치를 새로운 작업에 맞게 미세 조정하는 구체적인 과정이다.
- 적용 방식:
- 전이학습: 사전 학습된 모델을 사용하여 새로운 작업에 맞게 조정하지 않거나, 특징 추출기를 고정하고 상위 레이어만 학습하는 것까지 포함한다.
- 파인튜닝: 모델의 일부 또는 전체를 학습률을 낮춰가며 재학습하여, 기존 모델이 새로운 작업에 최적화되도록 조정한다.
- 사용 사례:
- 전이학습: 다양한 작업에 걸쳐 사전 학습된 모델을 활용하는 모든 상황을 포함한다.
- 파인튜닝: 주로 사전 학습된 모델이 새로운 데이터셋에 맞게 최적화될 필요가 있을 때 사용된다.
위처럼 파인튜닝은 전이학습의 일부로 전이학습의 범위 안에서 모델을 더 세밀하게 조정하는 방법이다. 전이학습은 더 큰 개념으로, 파인튜닝 외에도 다양한 방법으로 지식을 전이할 수 있다.
4. 수료증을 위한 마지막 Test
신선한 과일과 썩은 과일을 분류하는 코드이다.
from tensorflow import keras
base_model = keras.applications.VGG16(
weights='imagenet',
input_shape=(224, 224, 3),
include_top=False)
위의 코드에서 weights와 include_top 값을 수정하는 문제였다. weights는 imagenet에서 가져온 데이터를 사용하기 때문에 weights 값을 지정하였고, 전이학습을 사용하였기 때문에 가장 최상단 Layer은 포함시키지 않는다.
# Freeze base model
base_model.trainable = False
기초가 되는 모델의 학습가능 여부를 불가능으로 설정함으로써 기존의 모델의 변경 없이 학습되어 있는 값만을 사용한다는 뜻이다.
# Create inputs with correct shape
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)
# Combine inputs and outputs to create model
model = keras.Model(inputs, outputs)
입력층을 설정해주고, 기본 모델의 입력층과 학습 가능 여부를 설정하고, 풀링연산을 진행한다. 출력층을 설정해주고, 한 개의 모델로 합쳐준다.
model.compile(loss = keras.losses.CategoricalCrossentropy(from_logits=True), metrics = keras.metrics.CategoricalAccuracy())
이번 문제는 범주형 문제이기 때문에 Categorical_Crossentropy를 사용하였고, 정규화를 진행해야한다는 뜻의 from_logits 값을 True로 설정해준다. 또한 metrics로는 Categorical(범주형)만의 정확도를 사용해주었다.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
samplewise_center=True, # set each sample mean to 0
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) # we don't expect Bo to be upside-down so we will not flip vertically
모델의 정확도를 위해 데이터증강을 실시해준다. rotation값, 회전 각도를 최대 180도까지 설정해주고, 이미지의 확대, 너비, 높이의 변경, 상하좌우 반전 값을 모두 설정해주고 새로운 이미지들을 만들어낸다.
# 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")
이제 학습 데이터와 validation(검증)데이터를 불러온다.
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=30)
train데이터와 valid데이터를 기반으로 모델을 학습시키는데, epochs가 사용할 batch크기를 정해준다. train데이터 전체 크기를 배치 사이즈로 나누어 값을 지정해준다. validation_steps도 마찬가지로 설정해준다. 마지막으로 학습 횟수를 설정해주면 모델에 대한 학습을 진행하게 된다.
# 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(from_logits=True), metrics = keras.metrics.CategoricalAccuracy())
만약 높은 정확도가 나오지 않았을 때를 대비해서 파인튜닝을 진행한다. 위에서 학습을 불가능하게 설정했으니, 가중치를 조정하기 위해 학습을 가능하게 바꾸어준다. 학습률을 0.00001로 설정하여 가중치를 미세하게 조정해준다.
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=30)
다시 학습시킨 모델을 기반으로 예측을 진행한다.
model.evaluate(valid_it, steps=valid_it.samples/valid_it.batch_size)
모델을 평가한다.
모델의 정확도와 손실률을 표시해준다.
이번 수업은 지난 시간동안 배운 내용을 이해하기 쉽게 풀어서 진행한 수업 같다는 생각이 들었고, 정말 재미있는 수업이었다.
'ABC부트캠프 데이터 탐험가 과정' 카테고리의 다른 글
[29일차] ABC 부트캠프 기술나눔활동 (0) | 2024.08.13 |
---|---|
[28일차] ABC 부트캠프 Transformer 모델을 이용한 자연어 처리(NLP) (1) | 2024.08.12 |
[26일차] ABC 부트캠프 미니 프로젝트 발표회 (0) | 2024.08.11 |
[25일차] ABC 부트캠프 미니 프로젝트 (0) | 2024.08.07 |
[24일차] ABC 부트캠프 FNN, RNN, LSTM (0) | 2024.08.06 |