728x90
반응형

 

 

Paper : https://ieeexplore.ieee.org/abstract/document/726791

 

 

Convolutional Neural Network 연구의 시초라고 할 수 있는 LeNet 입니다. 논문 제목은 "Gradient-based learning applied to document recognition" 이며, 인용 수가 무려 54,056회나 되고, 1998년에 처음 공개되었습니다. LeNet은 CNN을 처음으로 개발한 얀 르쿤(Yann Lecun) 연구팀이 1998년에 개발한 CNN 알고리즘의 이름입니다. 

 

 

 

LeNet-5의 구조

LeNet-5의 구조는 아래와 같습니다. 

 

 

3개의 Conv Layer (C1, C3, C5)로 구성되어 있으며, 2개의 Sub-sampling Layer(S2, S4), 그리고 1개의 Full-connected Layer(F6)으로 구성되어 있습니다. 활성화 함수로는 tanh 함수를 사용했다고 합니다. 

 

Input

32x32 크기의 이미지

 

C1

Input 데이터로 부터 5x5 크기를 갖는 filter 6개를 통해 28x28 사이즈의 feature map 6개를 생성 

 

S2

C1으로 부터 2x2 크기의 filter 6개를 통해 14x14 크기의 feature map 6개를 생성

이 때 average pooling을 사용하게 되는데, 2x2 receptive field 가 overlapping 되지 않도록 적용 

 

C3

S2로 부터 5x5 크기의 filter 16개를 통해 10x10 크기의 feature map 16개를 생성

 

S4

C3으로 부터 다시 sub-sampling 수행

즉, average pooling 수행. 2x2 크기의 filter 16개를 통해 5x5 크기의 feature map 16개 생성 

 

C5

S4로 부터 5x5 크기의 filter 120개를 통해 1x1 크기의 feature map 120개를 생성 

 

F6

C5로 부터 1x1 feature map 84개를 생성

여기서 출력 값이 84개인 이유는 ASCII set을 해석하기 위한 적합한 형태로 나와주길 원했기 때문에 그렇게 설정했다고 합니다. 각 문자가 7x12 크기의 bitmap이라고 하네요. 

 

Output

최종적으로 10개의 output을 생성합니다. 데이터세트를 MNIST(0부터 9까지 이루어진 숫자 데이터 세트)를 사용했기 때문입니다. 

 

 

PyTorch 구현 

pytorch로 구현해보면 다음과 같습니다. 

 

from torch import nn
import torch.nn.functional as F

class LeNet_5(nn.Module):
    def __init__(self):
        super(LeNet_5,self).__init__()
        self.conv1 = nn.Conv2d(1, 6, kernel_size=5, stride=1)
        self.conv2 = nn.Conv2d(6, 16, kernel_size=5, stride=1)
        self.conv3 = nn.Conv2d(16, 120, kernel_size=5, stride=1)
        self.fc1 = nn.Linear(120, 84)
        self.fc2 = nn.Linear(84, 10)

    def forward(self, x):
        x = F.tanh(self.conv1(x))
        x = F.avg_pool2d(x, 2, 2)
        x = F.tanh(self.conv2(x))
        x = F.avg_pool2d(x, 2, 2)
        x = F.tanh(self.conv3(x))
        x = x.view(-1, 120)
        x = F.tanh(self.fc1(x))
        x = self.fc2(x)
        return F.softmax(x, dim=1)


model = LeNet_5()
summary(model, (1, 32, 32))

 

 

 

 

torchsummary 라이브러리를 이용하면 아래와 같이 요약 할 수 있습니다. 굉장히 단순한 구조입니다.

 

728x90
반응형