ABC부트캠프 데이터 탐험가 과정

[34일차] ABC 부트캠프 최종 프로젝트 기술 구현

hwibeenjeong 2024. 8. 23. 00:46

'

최종 프로젝트에서 사용하는 기술의 변경점이 생겼다. 지난 게시물에서 CNN을 이용한 이미지 분석을 활용하였지만, 낮은 정확도에 뉴런의 수, 레이어의 개수를 바꿔가며 학습시켜봤다. 하지만 결과는 변함 없이 낮은 정확도를 보였다. 그렇기에 최후의 수단으로, 사전 학습 모델(Pretrained Model)을 활용하기로 했다. 단순히 사전 학습 모델을 사용하면 의미가 없기에, 사전학습모델을 사용했을 때의 정확도와 추가로 Dense를 쌓아 보강하기로 했다. 먼저 코드를 살펴보자.

 

1. 직접 구현한 모델의 정확도

해당 결과는 직접 구현한 모델의 최대 정확도였다. 하지만 사전 학습모델에 Dense 층을 추가했을 때의 결과는 달라졌다.

먼저 결과부터 살펴보자.

2. 사전 학습 모델 + Dense 추가

기존의 모델에서 정확도가 10% 향상된 모습을 확인할 수 있었다. 그렇다면 수정된 코드를 살펴보자.

# VGG19 모델 로드 (사전 학습된 가중치 사용, 최상위 분류 층 제외)
base_model = VGG19(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

# 기존 가중치를 고정하여 학습되지 않도록 설정
base_model.trainable = False

# VGG19 모델 위에 새로운 분류 층 추가
model = models.Sequential([
    base_model,
    layers.Flatten(),
    layers.Dense(512, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(256, activation='relu'),  # 추가된 Dense 층
    layers.Dropout(0.3),
    layers.Dense(1, activation='sigmoid')
])

이미지 판별 모델 중 하나인 VGG19 모델을 최상위 레이어 없이 불러온다. 그 이유는 기존의 데이터를 학습할 때 생기는 패턴 등을 학습하고 있을 가능성이 있기에 최상위 레이어는 생략한다. 다음으로 배열의 평탄화, Fully Connected Layer인 Dense를 추가하고, 과적합을 방지하기 위한 Dropout을 추가한다. 이렇게 512개의 뉴런을 가진 Dense를 추가하고, Dropout을 진행한 뒤 출력층을 설정했을 때의 결괏값은 0.82로 별반 다를 바가 없었다. 하지만 256개의 뉴런을 가진 Dense를 추가하고, Dropout을 설정하니 사진과 같은 0.88과 같은 정확도를 보였다.

 

사실 0.88 또한 높은 정확도라고 할 수 있지만, 질병을 판단하고, 가이드라인을 제공하기에는 부족한 정확도였다. 그렇기에 다음과 같이 설정한 뒤 다시 학습중이다.

# VGG19 모델 로드 (사전 학습된 가중치 사용, 최상위 분류 층 제외)
base_model = VGG19(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

# 기존 가중치를 고정하여 학습되지 않도록 설정
base_model.trainable = False

# VGG19 모델 위에 새로운 분류 층 추가
model = models.Sequential([
    base_model,
    layers.Flatten(),
    layers.Dense(512, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(256, activation='relu'),  # 추가된 Dense 층
    layers.Dropout(0.3),
    layers.Dense(128, activation='relu'),  # 추가된 Dense 층
    layers.Dropout(0.1),
    layers.Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy',
              optimizer=Adam(learning_rate=1e-5),  # 작은 학습률을 사용하는 것이 일반적
              metrics=['accuracy'])
              
history = model.fit(
    train_generator,
    steps_per_epoch=train_generator.samples // 32,
    epochs=1_000,
    validation_data=validation_generator,
    validation_steps=validation_generator.samples // 32,
    callbacks=[checkpoint]
)

 수정한 코드는 크게 세 부분이다. 일단 Dense와 Dropout 한 쌍을 추가하여 연산 횟수를 증가시켰고, 학습률의 설정을 1e-5 =  0.00001로 설정하여 사전 학습 모델의 가중치를 미세하게 조정한다. 마지막으로, epochs의 값을 증가시켜 작은 학습률의 값으로 높을 정확도를 위해 여러번 학습하게 된다. 이를 통해 높은 정확도를 기대하며 이번 블로그를 마친다.

 

(수정)

너무 낮은 학습률과 많은 레이어는 연산 속도를 느리게하고, 정확도의 상승폭 또한 느리기에 레이어를 줄이고, 학습률을 올려본다.