ResNet (Residual Network)

3단 분석법

순서
분석
단어
내용
1
정의
ResNet
매우 깊은 Neural Network에서 발생하는 기울기 소실 문제를 해결하기 위해 Residual connections을 도입한 사전 훈련 모델 * Residual : 잔여, 잔차
2
알아야하는 이유
ResNet
매우 깊은 신경망에서도 기울기 소실 문제를 효과적으로 해결하여, 더 높은 정확도와 성능을 제공하는 딥러닝 모델을 구축할 수 있기 때문에
3
사용 방법
ResNet

정의

ResNet
매우 깊은 Neural Network에서 발생하는 기울기 소실 문제를 해결하기 위해 Residual connections을 도입한 사전 훈련 모델
Residual connections (skip connection)이 무엇인가요?
일반적인 신경망 모델 학습 시 모델의 층이 깊어질수록 학습 결과가 좋을 수 있다고 알려져 있습니다. 하지만 층을 너무 깊이 쌓거나 노드 수를 너무 크게 증가시키면 입력 정보가 여러 층을 거치면서 이전 층에 대한 정보 손실이 발생할 수 있고 가중치가 잘못된 방향으로 갱신되는 문제가 발생할 수 있습니다. 그래서 이전 층의 정보를 이용하기 위해 이전 층의 정보를 연결하는 잔차 연결(skip connection)을 적용합니다.
ResNet은 매우 깊은 Nerual Network에서 발생하는 기울기 소실 문제를 해결하기 위해 Residual connections을 도입한 사전 훈련 모델입니다.
Residual connections를 통해 깊은 네트워크에서도 vanishing gradient 가 발생하지 않고 학습을 진행할 수 있으며, ResNet은 50, 101, 152층 등 다양한 깊이의 모델로 구성됩니다.
Residual connections를 쉽게 이해하기 위해선, 수학 문제를 푸는 방식을 생각해보면 됩니다.
수학 문제 100문제를 1번부터 푸는 상황을 가정해 보겠습니다.
1번 문제를 푼 뒤 채점을 하고, 2번 문제를 푼 뒤 채점을 하는 것을 쭉 반복한다고 생각해보세요.
점점 문제를 풀면 풀 수록 1번 문제의 기억은 희미해질 것입니다.
즉, 딥 러닝에서 말하는 vanishing gradient가 발생하게 되는 것입니다.
ResNet은 이런 문제를 해결하기 위해서 1번 문제를 풀고 채점한 기억을, 2번 문제를 풀 때 기억을 더해서 진행합니다.
위와 같은 방법을 통해 vanishing gradient를 해결 하였습니다.
물론, 모델이 많이 무거워지는 단점이 존재해 지금은 잘 쓰이지는 않지만, 이 모델이 등장했을 당시에는 vanishing gradient를 직관적으로 해결할 수 있는 사전 훈련 모델 중 하나 였습니다.

알아야하는 이유

ResNet
매우 깊은 신경망에서도 기울기 소실 문제를 효과적으로 해결하여, 더 높은 정확도와 성능을 제공하는 딥러닝 모델을 구축할 수 있기 때문에
이유
설명
기울기 소실 문제 해결
깊은 신경망에서 발생하는 기울기 소실 문제를 잔차 연결을 통해 효과적으로 해결하여, 더 깊은 네트워크를 구성할 수 있습니다.
높은 성능
ResNet은 이미지 인식, 객체 탐지, 분류 작업에서 매우 높은 성능을 보이며, 다양한 컴퓨터 비전 과제에서 표준 모델로 널리 사용됩니다.
사전 훈련된 모델 사용 가능
Keras와 TensorFlow와 같은 라이브러리를 통해 쉽게 사용할 수 있는 사전 훈련된 모델을 제공하여, 새로운 데이터셋에 대해 빠르게 적용하고 좋은 성능을 얻을 수 있습니다.
확장성
ResNet은 다양한 변형 모델(ResNet-50, ResNet-101 등)로 확장 가능하며, 다양한 응용 분야에 적합합니다.

동작 방식

TensorFlow (Keras)

PyTorch

미니퀘스트

미니퀘스트 1 - MNIST 데이터셋을 이용한 ResNet 모델 사용

문제 설명

1.
라이브러리 임포트
필요한 라이브러리를 임포트합니다.
2.
데이터셋 로드 및 전처리
MNIST 데이터셋을 로드하고, 데이터를 전처리합니다.
# 2. 데이터셋 로드 및 전처리 (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 x_train = np.stack([x_train]*3, axis=-1) x_test = np.stack([x_test]*3, axis=-1) y_train = to_categorical(y_train, 10) y_test = to_categorical(y_test, 10)
Python
복사
3.
모델 생성
ResNet 모델을 생성하고 필요한 레이어를 추가합니다.
4.
모델 컴파일
옵티마이저와 손실 함수를 설정하여 모델을 컴파일합니다.
5.
모델 훈련
훈련 데이터를 사용하여 모델을 훈련합니다.
6.
모델 평가
테스트 데이터를 사용하여 모델의 성능을 평가합니다.

코드

# 1. 라이브러리 임포트 from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Input, Flatten, Dense, Resizing from tensorflow.keras.utils import to_categorical from tensorflow.keras.applications import ResNet50 import numpy as np # 2. 데이터셋 로드 및 전처리 (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 x_train = np.stack([x_train]*3, axis=-1) x_test = np.stack([x_test]*3, axis=-1) y_train = to_categorical(y_train, 10) y_test = to_categorical(y_test, 10) # 3. 모델 생성 model = Sequential() model.add(Input(shape=(28, 28, 3))) # Input 레이어 추가 model.add(Resizing(32, 32)) # Resizing Layer 추가 base_model = ResNet50(weights=None, include_top=False, input_shape=(32, 32, 3)) model.add(base_model) model.add(Flatten()) # Flatten Layer 추가 model.add(Dense(10, activation='softmax')) # Dense Layer 추가 # 4. 모델 컴파일 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 5. 모델 훈련 model.fit(x_train, y_train, epochs=5, batch_size=32, validation_split=0.1) # 6. 모델 평가 loss, accuracy = model.evaluate(x_test, y_test) print(f"Test loss: {loss}") print(f"Test accuracy: {accuracy}")
Python
복사

결과 (예시)

Test loss: 0.07824419438838959
Test accuracy: 0.9750999808311462

결과 설명

Test loss (0.0782)
손실 함수의 값입니다. 값이 낮을수록 모델의 예측이 실제 값과 가깝다는 것을 의미합니다. 여기서 0.0782라는 값은 매우 낮은 손실을 나타내며, 모델이 상당히 잘 학습되었음을 의미합니다.
Test accuracy (0.9751)
정확도입니다. 이는 모델이 테스트 데이터에서 얼마나 잘 예측했는지를 나타내는 지표로, 97.51%의 정확도를 의미합니다. 이는 매우 높은 정확도로, 모델이 MNIST 데이터셋에서 손 글씨 숫자를 잘 분류하고 있음을 나타냅니다.

코드 설명

미니퀘스트 2 - CIFAR-10 데이터셋을 이용한 ResNet 모델 사용

문제 설명

1.
라이브러리 임포트
필요한 라이브러리를 임포트합니다.
2.
데이터셋 로드 및 전처리
CIFAR-10 데이터셋을 로드하고, 데이터를 전처리합니다.
# 2. 데이터셋 로드 및 전처리 (x_train, y_train), (x_test, y_test) = cifar10.load_data() x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 y_train = to_categorical(y_train, 10) y_test = to_categorical(y_test, 10)
Python
복사
3.
모델 생성
ResNet 모델을 생성하고 필요한 레이어를 추가합니다.
4.
모델 컴파일
옵티마이저와 손실 함수를 설정하여 모델을 컴파일합니다.
5.
모델 훈련
훈련 데이터를 사용하여 모델을 훈련합니다.
6.
모델 평가
테스트 데이터를 사용하여 모델의 성능을 평가합니다.

코드

# 1. 라이브러리 임포트 from tensorflow.keras.datasets import cifar10 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Input, Flatten, Dense from tensorflow.keras.utils import to_categorical from tensorflow.keras.applications import ResNet50 # 2. 데이터셋 로드 및 전처리 (x_train, y_train), (x_test, y_test) = cifar10.load_data() x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 y_train = to_categorical(y_train, 10) y_test = to_categorical(y_test, 10) # 3. 모델 생성 base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(32, 32, 3)) model = Sequential() model.add(Input(shape=(32, 32, 3))) # Input 레이어 추가 model.add(base_model) model.add(Flatten()) # Flatten Layer 추가 model.add(Dense(10, activation='softmax')) # Dense Layer 추가 # 4. 모델 컴파일 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 5. 모델 훈련 model.fit(x_train, y_train, epochs=5, batch_size=32, validation_split=0.1) # 6. 모델 평가 loss, accuracy = model.evaluate(x_test, y_test) print(f"Test loss: {loss}") print(f"Test accuracy: {accuracy}")
Python
복사

결과 (예시)

Test loss: 0.13424419438838959
Test accuracy: 0.8901998043051462

결과 설명

Test loss (0.1342)
손실 함수의 값입니다. 값이 낮을수록 모델의 예측이 실제 값과 가깝다는 것을 의미합니다. 여기서 0.1342라는 값은 비교적 낮은 손실을 나타내며, 모델이 상당히 잘 학습되었음을 의미합니다.
Test accuracy (0.8901)
정확도입니다. 이는 모델이 테스트 데이터에서 얼마나 잘 예측했는지를 나타내는 지표로, 89.01%의 정확도를 의미합니다. 이는 높은 정확도로, 모델이 CIFAR-10 데이터셋에서 객체를 잘 분류하고 있음을 나타냅니다.

코드 설명

미니퀘스트 답안지

ⓒ 2024 startupcode. 모든 권리 보유. 무단 복제 금지.