사전 학습된 모델 재구성 + 미세 조정(fine-tuning)
- 특성 추출(feature extractor) 부분은 학습을 시키지 않고 사전 학습된 모델(가중치)을 이용하여 입력 이미지로부터 특성만 추출
- 분류(classifier) 부분을 수정하고 집중적으로 학습
- 적은 양의 데이터와 짧은 학습 시간으로 분류 성능 향상
사전 학습된 모델 재구성
# ResNet 원본 모델 구조 확인하기
resnet = tf.keras.applications.ResNet152V2(
weights='imagenet',
input_shape=(224,224,3)
)
resnet.summary()
# 사전 학습된 모델 가져오기
pretrained_model = tf.keras.applications.ResNet152V2(
include_top=False,
weights='imagenet',
input_shape=(224,224,3)
)
# 모델 구조 확인
pretrained_model.summary()
# 사전 학습된 모델의 전체 계층의 인덱스와 이름 확인하기
for idx, layer in enumerate(pretrained_model.layers):
print(f'layer의 인덱스 : {idx}, layer의 이름 : {layer.name}')
# 사전 학습된 모델의 전체 계층의 가중치 동결하기
for layer in pretrained_model.layers:
layer.trainable=False
# 재구성 모델 생성하기
# 입력 생성
inputs = pretrained_model.inputs
print(f'재구성 모델의 입력 : \n{inputs}')
print('-'*80)
# 특성 추출의 결과물(feature map : 7*7*2048)
x = pretrained_model.get_layer(index=563).output
# 출력층 정의
x = tf.keras.layers.GlobalAveragePooling2D()(x)
predictions = tf.keras.layers.Dense(units=2, activation='softmax')(x)
# 모델 재구성
model3 = tf.keras.Model(inputs=inputs, outputs=predictions)
# 모델 구조 확인
model3.summary()
# 이미지 폴더 경로 설정
train_path = '/content/drive/MyDrive/CV/cats_and_dogs/train'
val_path = '/content/drive/MyDrive/CV/cats_and_dogs/val'
test_path = '/content/drive/MyDrive/CV/cats_and_dogs/test'
# ImageDataGenerator() 함수 실행
train_datagen3 = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
val_datagen3 = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
test_datagen3 = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
# ImageDataGenerator() 함수와 flow_from_directory() 함수를 사용, 입력 데이터 생성
# 학습용 데이터 생성
train_generator3 = train_datagen3.flow_from_directory(directory=train_path,
batch_size=60,
target_size=(224,224),
class_mode='categorical')
# 검증용 데이터 생성
val_generator3 = val_datagen3.flow_from_directory(directory=val_path,
batch_size=60,
target_size=(224,224),
class_mode='categorical')
# 평가용 데이터 생성
test_generator3 = test_datagen3.flow_from_directory(directory=test_path,
batch_size=10,
target_size=(224,224),
class_mode='categorical')
# optimizer 재설정
optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)
# 컴파일
model3.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
# 조기 종료 설정
early_stop = tf.keras.callbacks.EarlyStopping(
monitor='val_loss',
patience=3
)
# 최적의 학습 결과를 저장하기 위한 ModelCheckpoint 설정
checkpoint = tf.keras.callbacks.ModelCheckpoint(
filepath='/content/drive/MyDrive/CV/resnet_no_fine.keras',
monitor='val_loss',
save_best_only=True
)
# 학습 진행
model3.fit(
train_generator3,
validation_data=val_generator3,
epochs=10,
callbacks=[early_stop, checkpoint]
)
# 저장된 모델 불러오기
# 파일 경로 설정
file_path='/content/drive/MyDrive/CV/resnet_no_fine.keras'
# 모델 불러오기
loaded_model1 = tf.keras.models.load_model(file_path)
# 모델구조 확인하기
loaded_model1.summary()
# 모델 평가
# model evaluate() 함수 사용
score = loaded_model1.evaluate(test_generator3)
# 결과 확인하기
print(f'평가용 데이터에 대한 손실 : {score[0]}')
print('-'*80)
print(f'평가용 데이터에 대한 정확도 : {score[1]}')
# 재구성 모델 정의하기 > 함수식 표현
# 입력층 생성
input = pretrained_model.inputs
# 특성 추출의 결과물 생성
x = pretrained_model.get_layer(index=563).output
# 출력층 정의
y = tf.keras.layers.GlobalAveragePooling2D()(x) #f(x)
prediction = tf.keras.layers.Dense(units=2, activation='softmax')(y)
# 모델 재구성
model4 = tf.keras.Model(inputs=input, outputs=prediction)
# 모델 구조확인
model4.summary()
# optimizer 재설정
optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)
# 컴파일
model4.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
# 이미지 폴더 경로 설정
train_path = '/content/drive/MyDrive/CV/cats_and_dogs/train'
val_path = '/content/drive/MyDrive/CV/cats_and_dogs/val'
test_path = '/content/drive/MyDrive/CV/cats_and_dogs/test'
# imageDataGenerator() 함수 > 데이터 증식 조건 설정
# 학습용 이미지 증식 조건 설정
train_datagen4 = tf.keras.preprocessing.image.ImageDataGenerator(
rescale=1/255,
rotation_range=30,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
vertical_flip=True
)
# 검증용 이미지 생성
val_datagen4 = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
# 평가용 이미지 생성
test_datagen4 = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
# imageDataGenerator() 함수와 flow_from_directory() 함수 사용, 입력 데이터 생성
# 학습용 데이터 생성
train_generator4 = train_datagen4.flow_from_directory(directory=train_path,
batch_size=60,
target_size=(224,224),
class_mode='categorical')
# 검증용 데이터 생성
val_generator4 = val_datagen4.flow_from_directory(directory=val_path,
batch_size=60,
target_size=(224,224),
class_mode='categorical')
# 평가용 데이터 생성
test_generator4 = test_datagen4.flow_from_directory(directory=test_path,
batch_size=10,
target_size=(224,224),
class_mode='categorical')
# 조기 종료 설정
early_stop = tf.keras.callbacks.EarlyStopping(
monitor='val_loss',
patience=3
)
# 최적의 학습 결과를 저장하기 위한 ModelCheckpoint 설정
checkpoint = tf.keras.callbacks.ModelCheckpoint(
filepath='/content/drive/MyDrive/CV/resnet_aug_fine.keras',
monitor='val_loss',
save_best_only=True
)
# 학습 진행
model4.fit(
train_generator4,
validation_data=val_generator4,
epochs=10,
callbacks=[early_stop, checkpoint]
)
# 저장된 모델 불러오기
# 파일 경로 설정
file_path='/content/drive/MyDrive/CV/resnet_aug_fine.keras'
# 모델 불러오기
loaded_model2 = tf.keras.models.load_model(file_path)
# 모델구조 확인하기
loaded_model2.summary()
# 모델 평가
# model evaluate() 함수 사용
score = loaded_model2.evaluate(test_generator4)
# 결과 확인하기
print(f'평가용 데이터에 대한 손실 : {score[0]}')
print('-'*80)
print(f'평가용 데이터에 대한 정확도 : {score[1]}')
참고 자료