하지만 여러가지 이유(시간 부족, 학습 환경 부실)로 인해 CV를 사용하기가 힘든 경우라면?
신경망을 한번 학습시키는데만 해도 엄청난 시간이 필요하며 한 cycle(큰 수의 epoch)을 돌리는데 시간 뿐만 아니라 학습 환경또한 벅찬 경우가 있습니다.
train set으로 학습시키고 validation set으로 검증한 뒤, test set을 사용하여 최종 결과물을 낸 model이 있습니다.
하지만 이 모델은 validation set으로 사용한 데이터를 한번도 보지 못했기때문에 아마(100% 확실하지 않기 떄문) 성능이 떨어질거라고 예상됩니다. 모델은 데이터를 많이 보면 볼수록 견고(robust)해지고, 최종적으로 일반적이게 되니까요.
그럼 우리는 최종 모델을 어떻게든 저장을 했을 겁니다. hdf5든 h5든 어떠한 형식으로든요. 다시 로드해서 이번엔 split 과정을 거치지 않습니다. 모델을 더욱 강화시키기 위해서 entire set으로 retrain시킵니다. 이때 당연한 사실이지만 반드시 test set은 건들지 말아야합니다.
이렇게 해서 새롭게 얻어진 모델로 inference를 하여 최종 성능을 얻을 수 있습니다.
이상적으로 CV를 통해 score를 얻을 수 있다면, 이를 이용해서 비교헀을때 성능이 유사함을 알 수 있습니다.
신경망의 성능을 향상시키는 방법에는 상당히 많은 방법이 존재합니다. 도메인이나 모델에 따라서도 다양하게 존재합니다.
하지만 공통적으로 모델을 구성하기 전에 가장 중요한 방법이 있습니다.
바로 Data augmentation 작업입니다.
데이터 증식은 flip, shear, translation, rotation 등의 방법을 제공하여 train set을 부풀리게 해주고, 우리가 구성한 모델을 더욱 견고하게 만들어주는 역할을 합니다. (모델이 한번도 보지 않은 이미지를 계속해서 보게함으로써 최종적으로 general한 모델로 만들어지니까요)
car image augmentation - 이미지 출처 캐글 코리아 3차대회
이는Train에서의 augmentation 방법이며, test에서의 augmentation 방법이 따로 있습니다. 그리고 이것을 Test Time Augmentation(TTA)라고 부릅니다.
TTA는 증강된 이미지를 여러번 보여준 다음 각각의 단계에 대해서 prediction을 평균하고 이 결과를 최종값으로 사용하는 것입니다.
이 방법을 사용하면 가장 좋은 점은 1번만 예측하여 결과를 도출했을 시에 해당 차량의 클래스가 아니라고 추측하는 반면, TTA를 통해 도출된 최종 결과값은 올바른 차량의 클래스라고 맞춘다는 것입니다.
이미 앙상블을 경험해 보셨다면(Xgboost + RF + adaboost etc.), 이 말이 무슨 뜻인지 이해하기 쉽습니다.
가장 쉽게 말해서 prediction ensemble이라고 생각하면 편합니다.
keras에서 사용하기는 더욱 쉽습니다. 단 몇줄의 코드로 끝나게 됩니다.
tta_steps = 10
predictions = []
for i in tqdm(range(tta_steps)):
# generator 초기화
test_generator.reset()
preds = model.predict_generator(generator = test_generator, steps = len(test_set) // batch_size, verbose = 1)
predictions.append(preds)
# 평균을 통한 final prediction
pred = np.mean(predictions, axis=0)
# argmax for submission
np.mean(np.equal(np.argmax(y_val, axis=-1), np.argmax(pred, axis=-1)))