딥러닝에서 기울기 소실 문제를 해결하기 위해 잔차학습 진행
기존의 네트워크는 입력에서 출력까지 매칭을 직접 학습하는 방식과 달리, ResNet은 잔차 블록을 사용하여 네트워크에 입력값을 직접 추가하는 방식으로 학습
잔차학습 : 입력과 출력 간의 차이
→ 역전파가 더 쉽게 이루어지고 네트워크 깊이를 키우는 데 도움이 됨

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