[프로젝트 1 - 이미지 처리] 3. 모델

Jade·2021년 4월 1일
0

부스트캠프 AI Tech

목록 보기
33/54

프로젝트 1 - 모델

  • pytorch의 모델
  • pretrained 모델

[pytorch 모델]

파이토치에서 모델에 들어가는 모든 레이어는 nn.Module 클래스를 상속받아서 사용한다. 커스텀 데이터셋을 만들 때 Dataset을 상속받았던 것처럼, 어떤 모델을 정의할 때 nn.Module을 상속받아서 만들 수 있다.

생성자 __init__에서는 모델의 구조를 결정한다. nn.Module을 상속받아 사용할 경우 부모 클래스의 생성자를 가져와서 nn.Module에 정의된 기능을 쓸 수 있다.

forward 메소드는 모델이 호출되었을 때 실행된다. 입력이 들어와서 모델의 레이어들을 거쳐 최종 출력을 반환하는 연쇄적 과정으로, 순전파 역할을 한다.

class MyModel(nn.Module):

def __init__(self):
    super(MyModel, self).__init__()
    self.conv1 = nn.Conv2D(...)
    self.conv2 = nn.Conv2D(...)

def forward(self,x):
    x = F.relu(self.conv1(x))
	return F.relu(sefl.conv2(x))

nn.Module을 상속받은 클래스들은 전부 연결되어 있다. 내가 정의한 모델이 nn.Module을 상속받아 사용한다면 내 모델의 forward 메소드가 실행되었을 때 LinearConv2D 처럼 forward 안에 정의된 레이어들(걔네도 클래스)의 forward도 연쇄적으로 실행된다.

클래스들이 연결되어 있어서 쭉 따라 내려가면서 파라미터를 확인할 수도 있다. 모델 안에 정의된 레이어의 파라미터 data, grad, requires_grad 등을 확인하거나 변경할 수도 있는데, 이를 이용해 requires_grad 옵션을 잠시 바꿔서 학습이 되거나 안 되게 토글할 수도 있다.


[pretrained 모델]

torchvision.models 안에는 VGGNet이나 ResNet 등 엄청난 양의 데이터로 사전 훈련된 좋은 모델들이 많다. 이걸 받아서 쓸 수 있는데, 모델 구조뿐만 아니라 가중치와 바이어스도 가져다 쓸 수 있다. pretrained 모델을 가져다 쓸 때는 그 모델이 어떤 목적으로, 어떤 데이터를 가지고 학습했는지 잘 살펴본 다음에 써야 한다. EDA!!!
풀고자 하는 문제와 pretrained 모델 간에 유사성이 있어야 가져다 쓰는 의미가 있다.

CNN 기반의 모델에서 FC 레이어는 맨 마지막 층에 쓰이면서 분류기 역할을 한다. ImageNet 데이터로 훈련된 모델은 이미지를 1000개의 서로 다른 클래스로 구분할 목적으로 만들어졌는데, 프로젝트 1에서 만들 모델은 1000개 클래스가 아니라 18개의 클래스다. 이런 경우 pretrained 모델의 분류기를 그대로 사용할 필요도 없고 사용할 수도 없다. pretrained 모델을 가져다 쓸 때 데이터의 양과 수행할 작업의 유사도에 따라 모델을 쓰는 방법이 달라진다.

1. 학습 데이터가 충분하고 수행할 작업이 pretrained 모델과 비슷한 경우
학습 데이터가 충분하더라도 수행할 작업이 비슷한 경우에는 backbone으로 사용되는 pretrained 모델을 굳이 새로 학습시킬 필요가 없다. 더 잘 배웠을 테니까
backbone의 CNN 부분은 내가 가진 학습 데이터의 feature를 추출하는 용도로 두고 분류기만 새로 학습시켜서 쓰면 된다. (feature extraction)

2. 학습 데이터가 충분하고 수행할 작업이 pretrained 모델과 비슷하지 않은 경우
학습 데이터가 충분하다면 큰 문제가 되지 않는다. 가진 데이터를 사용해서 backbone 모델을 업데이트하면 된다. 분류기 역시 작업에 맞게 학습시킨다. (fine tuning)

3. 학습 데이터가 부족하고 수행할 작업이 pretrained 모델과 비슷한 경우
갖고 있는 이미지가 부족해서 backbone 모델을 업데이트하기 힘들다. 모델이 잘 배워 온 표현만 손상시킬 위험이 있다. 따라서 1번 경우와 비슷하게 backbone의 CNN 레이어는 동결해 두고 분류기만 학습시켜서 사용한다.

4. 학습 데이터가 부족하고 수행할 작업이 pretrained 모델과 비슷하지 않은 경우
이러면 pretrained 모델을 쓰는 의미가 없다. 그냥 모델을 새로 만들거나 다른 pretrained 모델을 찾는 것이 낫다.


[피어 세션]

어제 세션에서 재미있는 이야기가 많이 나와서 공유하는 방향으로 진행되었다. 그 밖에도 좋은 아이디어를 많이 얻었다.

  • 이번 프로젝트에서는 성능 평가 지표로 F1 score를 사용하는데, F1 score는 조화평균을 이용해 계산하기 때문에 데이터가 불균형할 때(특정 데이터가 많을 때) 사용할 수 있는 지표다.

  • 대진표 형식으로 학습해 나가면서 사람들의 나이를 판별하는 모델인 Ranking CNN이라는 것이 있다!

  • 동일인물의 사진이 학습 데이터셋과 검증 데이터셋에 동시에 속하면 안 된다. 데이터 유출이 일어나 정확한 검증을 할 수 없게 될 위험이 크다.

  • ImageNet에서 학습한 pretrained 모델을 그대로 써도 정확도가 76% 정도 나온다고 한다...!

  • 일요일 저녁마다 유튜브 라이브로 진행되는 딥러닝 논문 읽기 모임이 있다고 한다. 발표가 끝나고 실시간으로 질문도 가능.

profile
반가워용

0개의 댓글