네이버 부스트캠프 AI Tech 2기

[08.25 P Stage Day3] - 🤖 Models

Jay x 2 2021. 8. 28. 19:05
728x90
반응형

Model

오늘은 PyTorch 에서 Model을 만드는 방식에 대해서 학습한다.

Modeling

이 전에는 Vanila Data를 모델의 입력에 맞도록 Data Processing까지 처리가 되었다.

모델의 정의

: 모델은 Object, 사람, 시스템의 정보를 대표하는 것이다.

Using PyTorch

PyTorch

부스트 캠프 AI Tech에서는 PyTorch를 기반으로 하고 있다.

PyTorch는 연구하기도 좋고 공부를 시작하는 사람에게 이 프레임워크만한 것이 없다. 이유는 파이토닉한 특징도 있고, Runtime에 Dynamic하게 Graph가 그려지는 특징도 있다. 자유도도 높아 개발하는데 장점이 있다.

PyTorch의 특징

  • Low-Level : Low-level로 짜여져 있어서, 부분적으로 내용들을 이해하고 있으면 쉽게 Custom화 할 수 있다는 장점이 있다. (케라스나 텐서플로우 같은 경우는 기능적인 부분만 익힌다면 쉽게 사용 가능하지만 내가 원하는 Tuning에는 한계가 있다. 반면 파이토치 같은 경우는 처음 보면 기능을 이해하느데 어려움이 있겠지만, 한번 이해하면 더 Flexible하게 사용할 수 있다.)
  • PyThonic
  • Flexibility
  • Dynamic Graph

nn.Module

PyTorch 모델의 모든 레이어는 nn.Module 클래스를 따른다.

#예시
import torch.nn as nn
import torch.nn.functional as F

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__() #부모클래스에서 넘겨줄 것을 initialization한다.
        self.conv1 = nn.Conv2d(1, 20, 5) #Convolution Network1개
        self.conv2 = nn.Conv2d(20, 20, 5) #Convolution Network1개

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

foward 함수 (순전파 기능)

모델이 가지는 연결점들을 연결해 순서대로 진행되는 과정.

→ forward 함수도 nn.Module을 상속받으면 구현해주어야하는 함수이다.

실행하는 방법은 : 모델(X) 이런식으로 호출만 하면 forward 함수를 호출하게 된다.

모든 nn.Module은 child modules를 가질 수 있다.

→ 모델을 정의하는 순간에, 그 모델에 연결된 모든 module을 확인할 수 있다.

또한 forward함수를 한번만 실행한 것으로 그 모델의 forward에 정의된 모듈 각각의 forward()가 실행이 된다.

Parameters

: 모델에 정의되어 있는 modules가 가지고 있는 계산에 쓰일 파라미터

→ 1. model.state_dict() : 파라미터 상태를 print해서 확인할 수 있다.

→ 2. model.parameters() : 파라미터확인이 가능하다.

둘의 차이점은 위쪽은 key값과 tensor가 같이 확인이 가능하지만, 아래는 tensor만 확인이 가능하다.

(중요!)

파라미터들은 data, grad, requires_grad 변수 등등을 가지고 있다.

  • data : 파라미터의 값들
  • grad : 각각 파라미터가 어떤 Gradient를 가지고 있나.
  • requires_grad : boolean 값으로 grad를 적용할지 말지 여부 결정

또한, Parameter 들은 Python Dictionary 자료구조로 되어 있기때문에, Pre-Trained 된 모델의 파라미터 구조를 보고 우리가 원하는 모델에 적용하는 것은 충분히 가능하다. 반대로 발생할 수 있는 에러도 다양하게 일어나기 때문에 잘 다룰줄 알아야 한다.

Pre-Trained Model

: 매번 좋은 모델을 설계하는 것도 좋지만, 시간적인 효율과 나보다 더 정확한 모델들이 기존에 만들어져 있기 때문에 좋은 모델을 이해하고 적절히 가져다 사용하는 방법이 중요하다.

Computer Vision 발전

Opject Detection, Self-Driving 등등 많은 분야들이 발전하고 있다.

이렇게 급격하게 발전하게 된 계기가 하나있다.

ImageNet이 만들어졌다는 것.

: ImageNet은 엄청난 모델 그런 것은 아니고, 대용량의 이미지들이다.

→ ImgaeNet에서 구축된 엄청난 이미지들을 통해서 실험적으로 모델들을 구축해나가면서 빠르게 CV 분야가 발전할 수 있었다고 한다.

이렇게 많은 사람들이 많은 데이터를 통해서 기존에 여러가지 모델들을 구축해두었고 이를 적절한 분야 혹은 주제에 적용하기만 하면 시간적으로, 정확도측면에서도 효율적일 것이다.

이렇게 모델을 빌려서 사용하는 것을

Transfer Learning이라고한다.

CNN base 모델 구조

  • 실제 내 ResNet 18 사진 

(중요!) ResNet 같은 경우 마지막 out_features를 보면 1000개로 되어 있다. 이 Pre-Trained 된 모델은 실생활 존재하는 이미지를 1000개의 다른 Class로 구분하기 위한 모델이었기 때문이다.

→ 핵심은 Pre-Trained 모델의 목적과 우리가 만들 Custom 모델과 어느정도 연관성이 있는 지 따져가면서 적용해야한다.

Cases

  1. 문제를 해결하기 위한 학습 데이터가 충분할 때
    • 위의 방식은 Feature Extraction이라고 한다.
    • 아래 방식은 Fine Tuning이라고 한다.

  1. 학습 데이터가 충분하지 않을 때
  2. 데이터가 충분하지 않고 Similarity가 낮으면 그냥 안하는 게 낫다. 혹은 다른 모델을 찾아 나서는게 낫다. 그러나 HighSimilarity라면 위의 Feature Extraction을 적용해본다.
반응형