총 15가지의 새를 구분하는 CNN모델을 직접 구성하여 kaggle의 리더보드 상위에 위치하는 것을 목표로 한다.
데이터에 맞는 정규화를 진행해주기위해 각각 채널에 대해 평균, 분산값을 구하여 Data normalization을 진행해주었습니다.
transforms.Resize : input 이미지의 size를 통일해주기 위해서 적용하였습니다. (256x256)
transforms.CenterCrop : 중앙에 학습에 필요한 정보(Bird image)가 더 많을 것으로 생각하여 적용해 주었습니다.
transforms.RandomHorizontalFlip(0.5) : 50%확률로 Y축 방향으로 flip을 적용시켜주는 함수입니다.
transforms.RandomRotation(10) : 랜덤으로 Image의 각도를 10도 만큼 변환해주는 함수입니다.
transforms.Grayscale(0.1) : 10%확률로 흑백 이미지로 변환해주는 함수입니다.
transforms.ToTensor : 데이터의 타입을 Tensor로 변경해주는 함수입니다.
transforms.Normalize : 위에서 구한 각 채널의 평균, 분산을 통하여 normalizataion을 적용해주는 함수입니다.
처음엔 간단한 모델로 성능을 측정해 보았습니다. 해당 모델로 파라미터를 튜닝했을 때 valiation의 경우 80%, leader board에서 70%의 성능을 이루어 냈습니다.
해당 모델의 경우 파라미터를 다양하게 바꾸어 보았는데 계속 제자리 걸음이어서 좋은 feature map을 잘 추출해내지 못하는 것 같아 avg pooling을 사용하여 2번째 모델을 구성해 보았습니다. 하지만 그럼에도 성능의 개선이 없어 모델을 조금 더 깊게 구성해야 한다고 생각했습니다. 그래서 조금 더 딥한 모델을 구성했는데, cuda memory가 터지는 오류가 발생하였습니다. 그래서 1x1 convolution을 사용하여 채널수를 조정해 조금 더 깊은 모델을 아래와 같이 구성해 보았습니다. 해당 모델은 1x1 convolution을 사용하여 구성한 모델입니다. 채널수를 조정하여 파라미터 수를 줄이면서, 모델의 깊이는 더 깊어지도록 모델을 설정해보았습니다. 해당 모델로 좋은 성능을 거둘 수 있었고, 최종적으로 84%의 성능을 거둘 수 있었습니다.