카테고리 없음

[PyTorch] 프로그래머스 과제 - 미술작품 분류하기

skkim1080 2024. 3. 27. 11:38

 

 

프로그래머스에 과제 테스트로 머신 러닝 과제가 있어서 해봤습니다.

과제 해결보다는 이미지 분류 모델을 위한 일반적인 PyTorch 템플릿 코드 작성을 위한 글입니다. 

https://school.programmers.co.kr/skill_check_assignments/133

 

 

과제 내용: 7개의 클래스로 분류된 미술 작품의 분류 모델 개발하기

- 시간은 총 8시간

- 따로 개발 환경이 주어지진 않고 개인 컴퓨터에서 모델 학습하고 모델 결과를 정해진 csv 파일로 만들어서 제출하는 형식입니다.

- 시험이 시작되면 학습 데이터를 다운받을 수 있습니다. 

- 데이터는 train과 test로 나눠져 있으며, train으로 학습하고 test 폴더의 데이터로 결과를 생성하면 됩니다.

- train 폴더 안에는 각 클래스 별로 폴더가 있고 해당 폴더 안에 이미지 파일이 존재합니다. 

- train 데이터의 이미지는 총 1,698개 입니다.

- 모든 이미지 파일은 227x227x3 크기 입니다.

 

0. 라이브러리 Import & 하이퍼파라미터 세팅

 

1. 데이터 가져오기 & DataLoader 생성

1) 이미지 폴더에서 데이터 가져오기

 

이렇게 하면 폴더에 있는 클래스를 알아서 읽고 클래스별로 이미지 데이터를 생성합니다.

 

dataset의 데이터 확인하기

 

 

2) train 데이터와 validation 데이터 분할하기

저는 train:validation=8:2 비율로 분할했습니다.

 

3) DataLoader 생성하기

 

2. 모델 네트워크 정의하기

 

- PyTorch 에서는 모델을 정의하기 위해 nn.Module을 상속해야합니다. 

- nn.Module을 상속하고 __init__과 forward 함수를 재정의해야합니다. 

- __init__ 함수에서는 네트워크에 필요한 layer나 필요한 변수를 정의합니다. 

- forward함수에서는 입력 x에 대한 layer를 연결하고 결과를 출력합니다. 

 

- convolution layer의 filter size나 fully-connected layer의 구성등은 자유롭게 설정하면 됩니다. 

- 저는 Batch Normalization과 ReLU, Dropout을 적절히 섞었습니다. 

- 가장 첫번째 Conv2d에서의 입력 channel 크기는 흑백은 1, 컬러는 3으로 설정해야합니다.

  그리고 다음번 입력 채널 = 이전 출력 채널이 되도록 연결해야합니다. 

  (Conv2d(입력 채널, 출력 채널, kernel size))

- 각 conv layer 이후 feature map의 크기는 다음 사이트에서 편리하게 계산할 수 있습니다.

   http://layer-calc.com/

 

Streamlit

 

layer-calc.com

- conv layer가 끝나고 fc layer가 시작되기전에는 3차원 데이터를 일렬로 펴주는 작업이 필요합니다.

  view의 파라미터 중 2번째 파라미터는 conv layer의 마지막 크기와 일치해야합니다. 

  (소스 내 conv_out.view 부분)

- fully connected layer 또한 다음 입력 크기 = 이전 출력 크기가 되도록 연결하면 됩니다. 

  nn.Linear(입력 크기, 출력크기)

- multiple classifier 이므로 fully connected layer의 마지막 출력 크기는 클래스 개수가 되어야합니다. 

 

3. 모델, 손실함수, Optimizer 선언

 

- criterion = loss 함수

  multiple classifier는 nn.CrossEntropyLoss를

  binary classifier는 nn.BCELoss를 사용하면됩니다. 

- optimizer는 많은 종류가 있지만 무난하게 Adam을 주로 쓰는 편입니다. 

 

4. 모델 학습

 

- 저는 한 epoch 동안 trainloader 다 돌면 validation 수행하는 식으로 하는 편입니다.

- train 전에는 모델.train(), validation전에는 모델.eval()로 꼭 모드 설정을 해주셔야 합니다.

- multiple classifier 개발하는 데 딱 필요한 소스들만 군더더기 없이 작성해서 저기에 필요에 따라 수정하시면 될것같습니다. 

- 이렇게 하면 학습이 진행됩니다. 

 

 

학습 결과는 좋지 않았습니다.

프로그래머스에 올라온 우수 코드를 보니 모두 pretrain된 모델에 추가적으로 학습하셨더라구요

제 글은 PyTorch 템플릿 작성을 위한 글이지만 

정확도를 위한다면 다른 분들 처럼 pretrain 모델을 파인튜닝하는 것을 추천드립니다. 

(프로그래머스 우수 코드 설명)

https://prgms.tistory.com/68

 

2021 ML Dev-Matching | 미술 작품 분류하기 : 우수 코드 공개

머신러닝 개발자의 구직을 위한 데브매칭! 프로그래머스에서는 지난 5월 23일 '2021 Dev-Matching: 머신러닝 개발자'의 과제 테스트가 진행되었습니다. 문제 해결의 완벽한 정답은 없겠지만, 그래도

prgms.tistory.com