ResNet(Residual Networks)

degull·2024년 1월 8일

ResNet

딥러닝에서 기울기 소실 문제를 해결하기 위해 잔차학습 진행

기존의 네트워크는 입력에서 출력까지 매칭을 직접 학습하는 방식과 달리, ResNet은 잔차 블록을 사용하여 네트워크에 입력값을 직접 추가하는 방식으로 학습

잔차학습 : 입력과 출력 간의 차이

→ 역전파가 더 쉽게 이루어지고 네트워크 깊이를 키우는 데 도움이 됨

  1. 기울기 소실 문제를 하결하는 데 스킵 커넥션을 사용하며, 스킵 커넥션은 자기 자신을 미분하면 1이 나오기 때문에 신경망의 출력 부분에 입력을 더하는 방식으로 기울기를 최소 1로 확보하는 기법
  2. 합성곱되기 전의 입력이 최종적인 신경망의 출력과 더해짐 → H(x) = F(x) + x
  3. F(x)는 은닉층을 거친 이후 출력을 더함

ResNet의 학습은 F(x)의 최소화. x는 입력값이기 때문에 고정된 값이므로, H(x)와 x의 차이를 최소화함. H(x)와 x의 차이를 최소화한다는 것은 H(x)와 x를 비슷하게 즉, F(x)를 0으로 만드는 것

  • ResNet의 장점

    1. 층을 깊게 쌓을 수 있음
    2. VGG에 비해 학습이 안정적
    3. 기울기 소실 문제를 어느정도 해결
  • ResNet의 단점

    1. 가중치가 늘어나기 때문에 계산량이 많아짐
    2. VGG에 비해 오버피팅이 일어나기 쉬움
  • 유용한 곳

    1. 이미지 분류, 세그멘테이션, 이미지 생성 등 합성곱을 이용하는 모든 곳에서 이용 가능
    2. 이미지의 특징을 추출할 때 사용
    3. 스킵 커넥션은 이전 은닉층의 정보를 필요로 하는 텍스트 처리에서도 사용 가능

ResNet을 사용해 폐렴진단 프로그램 개발

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications import ResNet50
from tensorflow.keras import layers, models

# 사전 훈련된 ResNet50 모델 불러오기 (include_top은 Fully Connected 레이어 포함 여부)
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

# 기존 모델의 가중치를 고정
for layer in base_model.layers:
    layer.trainable = False

# 모델 정의
model = models.Sequential()
model.add(base_model)
model.add(layers.Flatten())
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(2, activation='softmax'))

# 데이터 제너레이터 설정
train_data_dir = '/content/chest_xray/train'
train_datagen = ImageDataGenerator(rescale=1./255,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   horizontal_flip=True,
                                   validation_split=0.2)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(224, 224),
    batch_size=32,
    class_mode='categorical',
    subset='training'
)

validation_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(224, 224),
    batch_size=32,
    class_mode='categorical',
    subset='validation'
)

# 모델 컴파일
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 모델 훈련
model.fit(train_generator, epochs=20, validation_data=validation_generator)

# 모델 저장
model.save('diagnose_resnet_model.h5')
profile
그래도 해야지

0개의 댓글