欲速不達

일을 급히 하고자 서두르면 도리어 이루지 못한다.

Fantastic AI, Fantastic World

공모전/연습

Dacon 교육 - 패션 의류 분류 Fashion MNIST

_껀이_ 2022. 7. 14. 01:09
728x90
반응형

Dacon 교육 파트에 있는 패션 의류 분류 Fashion MNIST를 구현했습니다.

 

https://dacon.io/competitions/open/235594/overview/description

 

패션 의류 분류 경진대회 - DACON

좋아요는 1분 내에 한 번만 클릭 할 수 있습니다.

dacon.io

데이터셋은 위의 Dacon 사이트를 통해 다운로드 할수 있습니다.

 

 

코드 구현은 Dacon 사이트의 코드 공유 탭에 있는 코드를 참고하였습니다.

https://dacon.io/competitions/open/235594/codeshare/4175?page=1&dtype=recent 

 

Pytorch를 이용한 가장 쉬운 방법, score : 0.9119

패션 의류 분류 경진대회

dacon.io

 

 

1. 데이터 확인 및 패키지 로드

- train.csv(127MB)

  - index

  - label

  - pixel(1-784)

- test.csv(22MB)

  - index

  - pixel(1-784)

- sample_submission.csv(78KB)

  - index

  - label

 

데이터를 다운로드 해보면 위와 같이 train.csv, test.csv, sample_submission.csv 세 개의 파일이 있습니다.

index는 각각 다른 옷의 이미지를 표시하기 위함이고, label은 0~9로 총 10가지 종류를 나타냅니다. pixel은 28X28 사이즈의 이미지를 1차원으로 나열하여 784개의 pixel로 이루어져 있고 해당 pixel 안의 값은 0~255의 밝기 값을 의미합니다.

 

우선 필요 패키지를 import합니다.

 

데이터 확인을 위해 path라는 변수에 파일이 위치한 경로를 지정하고 pd.read_csv()을 사용하여 csv를 불러옵니다. 이때 파일 내의 index 컬럼을 index_col로 지정해주면 좌측에 따로 index 번호가 나오지 않습니다.

 

 

위와 같이 로드한 파일들을 살펴보면

train 데이터는 총 60000개의 row와 785개의 컬럼이 있고 test 데이터는 10000개의 row와 784개의 컬럼이 있는 것을 확인할 수 있습니다. train 데이터에는 의류 카테고리를 의미하는 label 컬럼과 이미지를 나타내는 pixel1~pixel784 컬럼이 있으므로 컬럼 수가 785개가 됩니다.

train, test 각각의 변수명에 train.csv, test.csv 파일 안의 데이터 중 index를 제외한 데이터들을 넣어둡니다.

 

* Hyperparameters

hyperparameter와 device를 설정해둡니다.

 

 

 

2. 데이터셋 생성

학습에 사용할 데이터셋을 만들어 줍니다. 

 

train 데이터셋은 train 변수 안의 데이터에서 label과 image 데이터를 따로 뽑아내서 구성합니다.

train 변수 안의 데이터가 한 줄씩 불러와서 one_line[0]은 label로 one_line[1:]은 img로 append하여 나누어 줍니다. 그 후 각각 np.asarray()로 변환하여 주는데, 이때 img 데이터는 (IMAGE_SIZE = 28, IMAGE_SIZE = 28, CHANNEL = 1) 모양으로 reshape 해줍니다. 이는 1차원의 벡터값으로 되어있는 데이터를 2차원의 이미지로 취급하여 학습할 것이기 때문에 reshape을 통해 차원을 변경해주기 위한 것입니다.

 

 

test 데이터셋도 train 데이터셋과 유사하게 구현합니다. 차이점은 train 데이터셋에는 label이 있기 때문에 따로 분할 하는 작업을 거쳤지만 test 데이터에는 label이 없기 때문에 one_line으로 한줄씩 받아온 데이터를 그대로 img 변수에 append합니다.

 

* transforms

사용자 transform을 만들어 둡니다. transform은 이미지의 크기를 조절하거나 값을 변환하는 등 학습전에 데이터의 조건을 동일하게 변환해주는 것을 말합니다. 여기서는 ToTensor()를 통해 값을 Tensor형으로 변환하고 0.0 ~ 1.0으로 scaling해줍니다. 

 

transform에 대한 튜토리얼은 아래 링크에서 확인할 수 있습니다.

https://tutorials.pytorch.kr/beginner/data_loading_tutorial.html

 

사용자 정의 Dataset, Dataloader, Transforms 작성하기

저자: Sasank Chilamkurthy < https://chsasank.github.io> 번역: 정윤성 < https://github.com/Yunseong-Jeong> 머신러닝 문제를 푸는 과정에서 데이터를 준비하는데 많은 노력이 필요합니다. PyTorch는 데이터를 불러오는

tutorials.pytorch.kr

 

 

 

3. 모델 구현

모델에 input으로 들어가는 값은 image 데이터이며 (28,28,1)의 shape을 가진 이미지 데이터입니다. layer의 구성은 nn.Conv2d, nn.BatchNorm2d, nn.ReLU, nn.MaxPool2d를 사용했으며 nn.Sequential로 layer를 묶어주었습니다. 그리고 마지막의 fully connected layer를 사용하여 최종 결과물을 flatten하게 만들어줍니다.

 

Conv2d는 kernel 사이즈에 해당되는 이미지의 pixel값들을 convolution 연산하는 것을 말합니다. 이는 이미지의 특징점을 찾는데 사용됩니다.

BatchNorm2d는 각각의 batch 별로 평균과 분산을 이용해 정규화를 하는 것을 말합니다.

ReLU는 비선형성을 위한 Activation function입니다.

MaxPool2d는 output의 크기를 줄여주는 역할을 하며 MaxPool 외에도 AveragePool등이 있습니다.

 

 

 

4. Train 및 Test

 

학습에서 필요한 것은 Model, Lossfunction, optimizer입니다.

Lossfunction은 nn.CrossEntropyLoss를 사용했고, optimizer로는 Adam을 사용합니다.

 

* pytorch의 CrossEntropyLoss는 softmax와 cross-entropy loss가 합쳐진 메서드를 구현해놓았기 때문에 다중 분류에서 많이 쓰이는 Loss 함수입니다.

 

매 epoch마다 학습을 진행하며, loss가 min_loss(초기값 100000)보다 작을 때마다 best_model을 저장해줍니다.

test에서는 학습된 model을 불러와 test_dataloader 데이터들의 카테고리를 예측한다. model에 image를 input했을때의 값 output을 argmax한 값을 pred에 append하여 출력합니다.

 

 

 

5. 결과

 

train()과 test() 코드를 실행하여 학습합니다.

위의 이미지에서 보이는 것과 같이 100 epoch 중에서 95 epoch에서 가장 낮은 loss를 보였으므로 best_model로 저장됩니다. 

 

test 코드에서 best_model을 불러온 후 예측 결과값을 submission에 저장합니다.

 

 

6. 제출

최종 제출시 score는 0.8924가 나왔으며, 코드를 따라하며 간단한 ML을 구현해본 것에 의의를 둔 연습이었습니다.

 

 

728x90
반응형