티스토리 뷰
1. ResNet(Residual Network)이란?
ResNet(Residual Network)은 딥러닝의 이미지 처리 분야에서 매우 깊은 신경망을 효과적으로 학습하기 위해 설계된 신경망입니다. 딥러닝 모델이 깊어질수록 발생하는 문제(기울기 소실 문제)를 해결하기 위해 Residual Block이라는 개념을 도입했습니다.
2. ResNet의 핵심 개념: Residual Block
Residual Block은 ResNet의 기본 단위입니다. 기존의 신경망은 입력 데이터를 다음 레이어로 단순히 전달합니다. 하지만 Residual Block은 데이터를 변환하는 대신, 변환 결과에 입력 데이터를 더해줍니다. 이를 **스킵 연결(Skip Connection)**이라고 합니다.
- 왜 Residual Block이 중요한가?
- 모델이 더 깊어지면 학습이 어려워지고 기울기(Gradient)가 점차 소실됩니다.
- Residual Block은 입력 데이터를 출력에 직접 더해주어, 네트워크가 학습하기 더 쉬워집니다.
- 즉, "이전 데이터를 유지하면서 변화를 추가"하는 방식입니다.
ResNet은 스킵 연결을 통해 깊은 신경망의 문제를 해결하고 학습을 쉽게 만듭니다.
Residual Block은 입력 데이터를 유지하며 변화를 학습하므로, "과적합 방지"와 "학습 효율성"을 동시에 제공합니다.
초보자도 Residual Block의 간단한 구조(입력 데이터 + 변환)를 이해하면 ResNet의 동작을 쉽게 파악할 수 있습니다.
3. Residual Block의 구조
Residual Block은 다음과 같은 구조로 이루어집니다:
- 입력 데이터를 변환(Conv2D, BatchNormalization, Activation).
- 변환된 데이터와 입력 데이터를 더함.
- 결과 데이터를 다음 레이어로 전달.
예를 들어:
- 입력 데이터: XX
- 출력 데이터: F(X)+XF(X) + X
여기서 F(X)F(X)는 데이터 변환 함수(예: Conv2D, BatchNormalization, ReLU).
4. Residual Block을 코드로 표현
from tensorflow.keras import layers
def residual_block(x, filters, kernel_size=3, stride=1):
# 입력 데이터를 저장 (스킵 연결을 위해)
shortcut = x
# 첫 번째 변환: Conv2D -> BatchNormalization -> Activation(ReLU)
x = layers.Conv2D(filters, kernel_size, strides=stride, padding="same", activation="relu")(x)
x = layers.BatchNormalization()(x)
# 두 번째 변환: Conv2D -> BatchNormalization
x = layers.Conv2D(filters, kernel_size, strides=1, padding="same")(x)
x = layers.BatchNormalization()(x)
# 스킵 연결 (shortcut과 변환 결과를 더함)
if stride != 1 or shortcut.shape[-1] != filters:
# 입력 데이터와 출력 데이터의 크기가 다르면 1x1 Conv2D로 맞춤
shortcut = layers.Conv2D(filters, kernel_size=1, strides=stride, padding="same")(shortcut)
x = layers.add([x, shortcut]) # F(X) + X
x = layers.ReLU()(x) # 최종 결과를 활성화 함수(ReLU)에 통과시킴
return x
5. ResNet 전체 구조
ResNet은 여러 개의 Residual Block을 쌓아 구성됩니다. 초기에는 Conv2D와 MaxPooling 레이어로 이미지를 처리하고, 이후 Residual Block을 여러 번 반복해 특징을 학습합니다.
ResNet의 기본 구조
- 초기 Conv 레이어:
- 이미지를 초기 처리하기 위한 Conv2D, BatchNormalization, MaxPooling 레이어.
- Residual Block 반복:
- Residual Block을 여러 번 반복해 입력 데이터의 특징을 학습.
- Global Average Pooling:
- 학습된 모든 특징을 압축.
- Fully Connected 레이어:
- 마지막으로 출력 뉴런(점수 예측)을 생성.
6. ResNet 전체 구조를 코드로 구현
from tensorflow.keras import layers, Model
def build_resnet(input_shape=(128, 128, 1)):
# 입력 레이어
inputs = layers.Input(shape=input_shape)
# 초기 Conv 레이어 (이미지 전처리)
x = layers.Conv2D(64, kernel_size=7, strides=2, padding="same", activation="relu")(inputs)
x = layers.BatchNormalization()(x)
x = layers.MaxPooling2D(pool_size=3, strides=2, padding="same")(x)
# Residual Block 1 (64개의 필터 사용)
x = residual_block(x, 64)
x = residual_block(x, 64)
# Residual Block 2 (128개의 필터 사용, 다운샘플링 적용)
x = residual_block(x, 128, stride=2)
x = residual_block(x, 128)
# Residual Block 3 (256개의 필터 사용, 다운샘플링 적용)
x = residual_block(x, 256, stride=2)
x = residual_block(x, 256)
# Global Average Pooling (특징 압축)
x = layers.GlobalAveragePooling2D()(x)
# Fully Connected 레이어 (최종 출력)
outputs = layers.Dense(1, activation="linear")(x) # 점수 예측
# 모델 정의
model = Model(inputs, outputs)
return model
7. 예시: Residual Block의 동작
- 기존 방식 (스킵 연결이 없는 경우):
- 입력 데이터: X=3X = 3
- 변환 함수: F(X)=X+2F(X) = X + 2
- 출력: F(X)=5F(X) = 5
- Residual Block (스킵 연결이 있는 경우):
- 입력 데이터: X=3X = 3
- 변환 함수: F(X)=X+2F(X) = X + 2
- 출력: F(X)+X=5+3=8F(X) + X = 5 + 3 = 8
8. ResNet 모델 사용의 장점
- 깊은 네트워크 학습 가능:
- Residual Block 덕분에 매우 깊은 네트워크를 학습할 수 있음.
- 스킵 연결로 기울기 소실 문제를 해결.
- 성능 향상:
- 이미지 분류, 회귀 문제 등에서 높은 성능을 제공.
- 효율성:
- 스킵 연결이 있어 네트워크가 더 효율적으로 학습 가능.
9. ResNet을 학습에 활용
728x90
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
반응형