상세 컨텐츠

본문 제목

[PyTorch Tutorial] LeNet-5 코드 분석

AI/PyTorch

by 쑤야. 2024. 8. 20. 18:13

본문

파이토치에서 제공하는 튜토리얼이 있는 것을 알게 되었고, 이를 활용하면 좋을 것 같다고 판단해 하나씩 공부해보려고 한다. 

 

https://pytorch.org/tutorials/beginner/introyt/introyt1_tutorial.html

 

Introduction to PyTorch — PyTorch Tutorials 2.4.0+cu121 documentation

Note Click here to download the full example code Introduction || Tensors || Autograd || Building Models || TensorBoard Support || Training Models || Model Understanding Introduction to PyTorch Follow along with the video below or on youtube. PyTorch Tenso

pytorch.org

 

아래는 LeNet-5이라는 모델이다. 

 

모델을 구현할 때는 Figure만 보고도 얼추 가능할 정도로 Figure의 역할이 중요하다.

 

Figure를 살펴보면 convolution 레이어가 2개, subsampling 레이어가 2개, full connection이 3개가 있는 것을 확인할 수 있다. 


먼저 모델을 구현한 전체 코드는 아래와 같다

 

학부 시절 부전공으로 AI를 전공하긴 했지만 강의를 들은 지 오래되기도 했고, 전공 지식이 좀 많이 증발한 상태라서 코드 내에서 사용된 관련 개념들도 하나씩 짚고 넘어가 보도록 하겠다. 

class LeNet(nn.Module):

    def __init__(self):
        super(LeNet, self).__init__()
        # 1 input image channel (black & white), 6 output channels, 5x5 square convolution
        # kernel
        self.conv1 = nn.Conv2d(1, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        # an affine operation: y = Wx + b
        self.fc1 = nn.Linear(16 * 5 * 5, 120)  # 5*5 from image dimension
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        # Max pooling over a (2, 2) window
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        # If the size is a square you can only specify a single number
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

    def num_flat_features(self, x):
        size = x.size()[1:]  # all dimensions except the batch dimension
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

모델을 구현하기 위해서 먼저 클래스 선언이 필요하며, init과 forward 함수 2가지를 선언해줘야 한다. 

class LeNet(nn.Module):

    def __init__(self):
        super(LeNet, self).__init__()

    def forward(self, x):
        return
  • '__init__':
    • 클래스의 생성자 메서드로 객체가 생성될 때 호출
    • 모델의 레이어 정의 및 초기화 역할 담당
  • 'forward':
    • 모델의 순전파를 정의
    • 입력 데이터를 받아서 레이어를 통과시키며 최종 출력을 계산하는 과정을 구현
    • 연산 정의 및 레이어 연결 역할을 담당하는데, __init__에서 정의한 레이어를 차례대로 호출하여 데이터를 변환

 


self.conv1 = nn.Conv2d(1, 6, 5) #in_channels, out_channels, kernel_size
  • 'nn.Conv2d':
    • 2차원 컨벌루션 연산을 수행하는 레이어를 정의하는 클래스
    • 2차원 컨벌루션은 주로 이미지 처리에서 사용되며, 입력 이미지의 공간적 구조(예: 패턴, 에지 등)를 학습하기 위해 사용
    • 2차원 컨벌루션 레이어는 입력 이미지에 필터(또는 커널)를 적용하여 특징 맵(feature map)을 생성하는데, 필터는 이미지의 작은 영역에 대해 가중치 연산을 수행

  • 'nn.Conv1d':
    • 1차원 컨벌루션 연산을 수행하는 레이어를 정의하는 클래스 
    • nn.Conv1d는 주로 시계열 데이터, 오디오 데이터, 또는 자연어 처리에서 사용
    • 일반적으로 1차원 배열로 표현되며, nn.Conv1d는 데이터에서 중요한 특징을 추출하는 데 유용
    • 1차원 컨벌루션 레이어는 입력 시퀀스 데이터에 필터(또는 커널)를 적용하여 특징 맵을 생성하는데, 필터는 데이터의 연속된 값(예: 시간, 단어 시퀀스 등)에 대해 가중치 연산을 수행

 

* 컨볼루션(convolution): 입력 데이터에서 중요한 패턴을 추출하기 위해 필터를 사용하여 가중 합을 계산하는 연산


self.fc1 = nn.Linear(16 * 5 * 5, 120)  # 5*5 from image dimension
  • 'nn.Linear':
    • PyTorch에서 선형 변환(fully connected layer 또는 dense layer)을 수행하는 레이어를 정의하는 클래스
    • 입력 데이터에 대해 가중치(weight) 행렬과 바이어스(bias)를 적용하여 출력 데이터를 생성
    • nn.Linear는 주로 신경망의 마지막 부분이나 피드포워드 신경망(MLP)에서 사용


x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
  • 'max_pool2d':
    • 2차원 입력 데이터(주로 이미지)의 공간적 크기를 줄이면서도 중요한 정보를 유지하기 위해 사용되는 풀링(Pooling) 연산을 수행하는 함수

  • 'relu':
    • ReLU는 입력이 0보다 크면 그대로 출력하고, 0 이하일 경우에는 0을 출력하는 활성화 함수

 

Subsampling

  • 입력 데이터의 크기를 줄이면서 중요한 정보를 유지하는 과정
  • 신호 처리, 이미지 처리, 그리고 딥러닝에서 자주 사용
  • 데이터의 해상도를 낮추거나, 계산 비용을 줄이기 위해 사용
  • 대표적인 방법으로 풀링(Pooling)이 존재

 

Pooling

  • 특정 영역에서 하나의 대표 값을 선택하여 특징 맵의 크기를 줄인다
  • 풀링은 주로 CNN에서 사용되며, 모델이 불변성을 갖추도록 돕고, 계산 효율성을 높인다
  • 풀링의 종류:
    1. Max Pooling: 데이터에서 가장 큰 값을 선택하여 해당 영역을 대표하는 값으로 사용
    2. Average Pooling: 평균값을 사용하여 대표하는 값을 선택하며 데이터의 특징이 부드럽게 유지된다

 

컨볼루션 이후 활성화 함수(relu)를 적용하는 이유

  • 컨볼루션 연산은 선형 변환이므로 컨볼루션 이후에 모델이 복잡한 패턴을 학습하기 어렵다
  • 비선형 활성화 함수를 사용해 신경망에 비선형성을 추가하여 더 복잡한 함수 근사와 패턴 학습을 가능하게 한다

x.view(-1, self.num_flat_features(x))
  • 'view':
    • 텐서의 모양을 변경
    • x.view(shape)은 텐서 x를 shape으로 정의된 새로운 형태로 변환하는데 shape은 텐서의 새로운 차원을 나타내며 -1을 사용하면 PyTorch가 나머지 차원을 자동으로 계산한다

 

이 코드에서 view(-1, self.num_flat_features(x))는 입력 텐서를 배치 크기 N을 유지하면서 2D 텐서 (N, C * H * W) 형태로 변환하며, 컨볼루션 레이어에서 추출된 특징을 완전 연결 레이어에 입력할 수 있도록 텐서를 평평하게 만드는 데 사용한다

'AI > PyTorch' 카테고리의 다른 글

PointNet 코드 분석 - PointNetfeat  (0) 2024.08.24
PointNet 코드 분석 - PointNetCls  (0) 2024.08.24
PointNet 코드 분석을 시작하기 전  (1) 2024.08.24

관련글 더보기