캐글 필사 스터디 7주차에는 Statoil/C-CORE Iceberg Classifier Challenge의 Keras Model for Beginners 커널을 필사하였습니다.
본 대회는 Statoil과 C-CORE 회사가 개최한 챌린지로, 제공된 위성사진에서 감지된 타겟이 배(ship)인지 빙하(iceberg)인지 Classify하는 것이 목표입니다. 사진을 두 가지 종류로 분류하기 때문에 Image classification이자 Binary classification인 문제입니다. Keras Model for Beginners 커널은 Keras를 사용해 CNN을 사용하는 커널로 CNN의 기초를 배우기에 좋은 커널입니다.
데이터 파악
대회에서 제공한 데이터 형식은 7z으로 다소 생소할 수 있는데요, 다음과 같은 코드를 통해 7z 파일의 압축을 풀어 지정된 경로에 파일들이 저장되도록 할 수 있습니다.
!pip install py7zr
import py7zr
import os
if not os.path.exists('/kaggle/train/') :
os.makedirs('/kaggle/train/')
if not os.path.exists('/kaggle/test/') :
os.makedirs('/kaggle/test/')
with py7zr.SevenZipFile("/kaggle/input/statoil-iceberg-classifier-challenge/train.json.7z", 'r') as archive:
archive.extractall(path="/kaggle/train")
with py7zr.SevenZipFile("/kaggle/input/statoil-iceberg-classifier-challenge/test.json.7z", 'r') as archive:
archive.extractall(path="/kaggle/test")
for dirname, _, filenames in os.walk('/kaggle'):
for filename in filenames:
print(os.path.join(dirname, filename))
#출처 : https://www.kaggle.com/sh0wmaker/binary-image-classification
data의 구성은 다음과 같습니다.
- id
- feature
- band_1, band_2 : 75x75 픽셀값. 이미지 데이터
- inc_angle : 입사각
- target
- is_iceberg : 0 => ship, 1 => iceberg
해당 커널에서는 5625 length로 주어진 train data를 (75,75)로 reshape한 후, 컬러 이미지이기 때문에 RGB 3채널로 만들고자 차원을 하나 추가한 후, band_1, band_2의 값과 함께 band_1과 band_2의 평균을 이용하기 위해서 셋을 concatenate 시켰습니다
iceberg와 ship에 해당하는 예시를 plotly를 이용해 시각화하면 다음과 같은 모습입니다.
Deep Learning 모델 : CNN
본 커널에서는 Keras로 모델을 만드는 방법 중에 Sequential API를 사용하는 방법을 이용해 CNN 모델을 만들었습니다. 이 방식을 이용하면 모델을 계층별로 층층이 연결해 쉽게 사용할 수 있다는 장점이 있으나, 다중입출력이 불가능하다는 점이 단점입니다. 또 다른 방법으로는 함수형 API인 Model 함수를 사용하는 방법이 있습니다.
CNN이 기존의 DNN과 비교하여 가지고 있는 차별점은 바로 Feature extraction을 하는 부분입니다.
Feature Extraction은 크게 Convolution layer와 Pool layer로 이루어집니다.
Convolution Layer에서는 수많은 필터들로 입력 데이터에서 이미지 분류에 필요한 feature data들을 뽑아냅니다. 전체 이미지를 특정 범위만큼 차례대로 훑으며 특정 필터에 부합하는 필터 정보를 얻습니다.
Pool Layer는 Convolution Layer 사이사이에 배치하여 Convolution layer의 출력 데이터를 입력으로 받아 출력 데이터인 Activation Map의 크기를 줄이거나 특정 데이터를 강조하거나, 오버피팅을 방지하는 용도로 이용됩니다. Pooling 방식에는 Max pooling과 Average Pooling이 있으며 각각의 방식이 작동하는 모습은 다음의 예시와 같습니다.
본 커널에서는 CNN의 핵심이라고 할 수 있는 Convolution layer와 Pool layer를 각각 4개 생성했으며, 활성화 함수로는 relu를 이용했습니다. 또한 Pooling은 Max pooling과 Average pooling 중 Max pooling을 선택하였습니다. relu 함수는 다음과 같은 모양을 가진 함수로, 최근 딥러닝 모델의 히든 레이어에서 많이 이용되는 추세입니다.
Pool layer 다음에 추가되어있는 Dropout은 오버피팅을 해소하기 위한 방법으로, 히든 레이어의 일부 유닛이 의도적으로 동작하지 않게 하여 오버피팅을 막습니다.
Classification 부분은 마지막 feature map을 flatten 하여 1차원으로 만든 후에 이미지를 분류하는 과정입니다. 본 커널에서는 Output layer에 학습 파라미터 최적을 위해 Adam 을 이용했습니다. Adam 은 모든 파라미터에 동일한 learning rate을 적용하는 그레디언트 방식과 다르게 파라미터에 따라 learning rate을 자동으로 변화시킵니다.
Model Evaluation을 하는 부분에서는 keras의 callback을 이용했는데, 과적합을 피하기 위한 regularization 방법 중 하나인 Early stopping과 함께 지정한 값을 기준으로 가장 좋은 성능을 갖는 모델을 저장하는 ModelCheckpoint를 함께 이용했습니다.
해당 챌린지와 관련된 커널에는 다음과 같은 커널들이 있으니 다른 시각으로 이 문제를 접근해보고 싶다면 참고하여 공부하는 것을 추천합니다.
'3-1기 스터디 > 캐글 필사' 카테고리의 다른 글
[8주차] 2018 Data Science Bowl - 세포 핵 탐지 자동화 알고리즘 (0) | 2022.01.16 |
---|---|
[8주차] TensorFlow Speech Recognition Challenge (0) | 2021.12.23 |
[6주차] Zillow House Value Prediction (0) | 2021.11.29 |
[5주차] Dynamics of New York city - Animation (0) | 2021.11.17 |
[4주차] Costa Rican Household Poverty Level Prediction (0) | 2021.11.14 |
댓글