Python DeepLearning

사전 학습된 모델(VGG, ResNet, EfficientNet) 활용법

PyExplorer 2025. 5. 9. 21:57
728x90

사전 학습된 모델(VGG, ResNet, EfficientNet) 활용법

1. 사전 학습된 모델이란?

딥러닝 모델을 훈련하는 과정은 방대한 데이터와 많은 연산을 필요로 합니다. 이러한 이유로, 대형 데이터셋(예: ImageNet)에서 미리 학습된 모델을 활용하면 새로운 작업에 적은 데이터와 자원으로도 좋은 성능을 얻을 수 있습니다. 이 과정이 바로 전이 학습(Transfer Learning) 입니다.

사전 학습된 모델은 주로 다음과 같은 목적으로 사용됩니다:

  • 특정 데이터셋에 맞춰 미세 조정(Fine-tuning)
  • 특징 추출기(Feature Extractor)로 활용

이 글에서는 대표적인 사전 학습된 모델인 VGG, ResNet, EfficientNet을 활용하는 방법을 소개하겠습니다.


2. VGG 모델 활용법

2.1 VGG 개요

VGG(Very Deep Convolutional Networks)는 Oxford의 연구팀이 발표한 모델로, 단순하지만 깊은 구조를 가지고 있습니다. VGG16과 VGG19가 대표적이며, 여러 개의 3x3 합성곱 필터를 연속적으로 적용하는 방식으로 설계되었습니다.

2.2 VGG 모델 불러오기 및 활용

TensorFlow/Keras를 이용해 VGG 모델을 불러오고 활용하는 방법을 살펴보겠습니다.

import tensorflow as tf
from tensorflow.keras.applications import VGG16
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Flatten

# VGG16 모델 로드 (가중치는 ImageNet에서 학습됨)
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
base_model.trainable = False  # 기존 가중치는 고정

# 새로운 분류기 추가
x = Flatten()(base_model.output)
x = Dense(256, activation='relu')(x)
x = Dense(10, activation='softmax')(x)  # 클래스 개수에 맞춰 변경

# 새로운 모델 생성
model = Model(inputs=base_model.input, outputs=x)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

위 코드는 VGG16 모델을 특징 추출기로 활용하여 새로운 데이터셋에 적용하는 예제입니다. base_model.trainable = False를 설정하면, 기존 가중치를 유지하면서 최상위 분류기만 학습할 수 있습니다.


3. ResNet 모델 활용법

3.1 ResNet 개요

ResNet(Residual Network)은 Microsoft에서 개발한 딥러닝 모델로, 깊은 신경망에서 발생하는 기울기 소실(Vanishing Gradient) 문제를 해결하기 위해 잔차 연결(Residual Connection) 을 도입했습니다.

ResNet의 주요 특징:

  • ResNet-50, ResNet-101, ResNet-152 등 다양한 깊이의 모델이 존재
  • 잔차 블록을 활용하여 매우 깊은 네트워크 학습 가능
  • 대규모 이미지 데이터셋에서 높은 성능을 보임

3.2 ResNet 모델 불러오기 및 활용

from tensorflow.keras.applications import ResNet50
from tensorflow.keras.layers import GlobalAveragePooling2D

# ResNet50 모델 로드
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
base_model.trainable = False  # 기존 가중치 고정

# 새로운 분류기 추가
x = GlobalAveragePooling2D()(base_model.output)
x = Dense(128, activation='relu')(x)
x = Dense(10, activation='softmax')(x)

model = Model(inputs=base_model.input, outputs=x)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

ResNet은 GlobalAveragePooling2D 층을 활용하여 특징을 압축하고, 새로운 분류기를 추가하여 활용할 수 있습니다.


4. EfficientNet 모델 활용법

4.1 EfficientNet 개요

EfficientNet은 Google Brain 팀에서 개발한 모델로, 모델 크기(Depth, Width, Resolution)를 동시에 조정하는 컴파운드 스케일링(Compound Scaling) 기법을 적용하여 높은 성능과 효율성을 제공합니다.

EfficientNet의 주요 특징:

  • ResNet보다 적은 연산량으로 높은 성능 제공
  • 다양한 크기의 EfficientNet-B0 ~ EfficientNet-B7 모델 존재
  • 이미지 분류, 객체 검출, 세분화 등 다양한 작업에 활용 가능

4.2 EfficientNet 모델 불러오기 및 활용

from tensorflow.keras.applications import EfficientNetB0

# EfficientNet 모델 로드
base_model = EfficientNetB0(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
base_model.trainable = False  # 기존 가중치 고정

# 새로운 분류기 추가
x = GlobalAveragePooling2D()(base_model.output)
x = Dense(256, activation='relu')(x)
x = Dense(10, activation='softmax')(x)

model = Model(inputs=base_model.input, outputs=x)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

EfficientNet은 ResNet보다 적은 연산량으로도 높은 성능을 낼 수 있어 모바일 및 임베디드 환경에서도 많이 사용됩니다.


5. 미세 조정(Fine-Tuning)

전이 학습에서는 기본적으로 사전 학습된 모델의 가중치를 고정하고 새로운 분류기를 학습하는 방법을 사용합니다. 하지만 경우에 따라 미세 조정(Fine-Tuning) 을 통해 성능을 더 향상시킬 수 있습니다.

5.1 특정 층부터 학습 가능하도록 설정

# 일부 레이어만 학습 가능하도록 설정
for layer in base_model.layers[-10:]:  # 마지막 10개 레이어를 학습 가능하도록 변경
    layer.trainable = True

model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5), loss='categorical_crossentropy', metrics=['accuracy'])

이렇게 하면 모델의 마지막 10개 층만 학습 가능하도록 설정하여 새로운 데이터에 맞게 미세 조정할 수 있습니다.


6. 결론

  • VGG: 간단한 구조로 빠르게 실험 가능하지만 상대적으로 무겁고 연산량이 많음.
  • ResNet: 깊은 네트워크에서도 학습 가능하며, 잔차 블록을 활용하여 성능이 뛰어남.
  • EfficientNet: 적은 연산량으로도 높은 성능을 제공하며, 다양한 크기의 모델이 존재함.
  • 미세 조정(Fine-Tuning) 을 통해 특정 층을 학습 가능하도록 설정하여 성능을 높일 수 있음.

사전 학습된 모델을 활용하면 적은 데이터와 자원으로도 높은 성능을 낼 수 있으며, 실전 프로젝트에서 빠르고 효율적인 딥러닝 모델을 구축하는 데 큰 도움이 됩니다.

728x90