ML 🐼/딥러닝 🔫

[논문 구현] 근본을 찾아서... 0. LeNet-5 (GradientBased Learning Applied to DocumentRecognition)

Dobby98 2022. 12. 5. 17:41

오늘은 "특별히" CNN 모델의 근본인 LeNet5를 Pytorch를 활용해서 구현해볼려고 합니다

최근 머신러닝을 sklearn없이 구현하고 있는 개인만의 프로젝트를 하고 있는데 추가 적인 개인 프로젝트로 DL 모델들로 직접 구현해보려고 한다 


논문 링크 : http://vision.stanford.edu/cs598_spring07/papers/Lecun98.pdf

 

오늘 구현해볼 논문은 98년도에 나온 CNN의 아버지 LeNet-5이다 (근본 중에 근본)

 

LeNet- 5 기본 구조 (LeNet-5 Architecture)

98년도에 나온 모델이므로 구조는 상당히 단순하다

 

 *전체적인 구조*

 3개의 Convolutions layer - 2개의 Subsampling layer - 1개의 fc레이어

[활성화 함수로는 tahn을 사용한다]

 

 

DATA INPUT : input size = 32x32x1 (채널이 1개인 이유 : 사용된 데이터가 MNIST로 1개의 채널만 갖고 있다)

Convolutions1 : 28x28x6 (28x28사이즈, 6개의 커널)

Subsampling layer 2 : 14x14x6 (14x14사이즈, 6개의 커널)

Convolutions3 : 10x10x16 (10x10사이즈, 16개의 커널)

Subsampling layer 4 : 5x5x16 (5x5사이즈, 16개의 커널)

Convolutions5 :120 (120사이즈 - FC레이어 시작)

F6 : 84 (84사이즈)

ouput : 10 (10개로 분류 0~9까지 숫자)

 

subsampling은 사실상 pooling으로 특성맵을 축소한다

여기서 사용되는 풀링은 평균 풀링average pooling으로 stride를 2로 설정한다

 

 

 

H == 입력데이터 Height

P == padding 사이즈 (여기서 padding은 사용되지 않는다)

FH == filter(커널) height

FW == filter(커널) width

S == stride

 

 

코드로 구현한 LeNet-5
import torch
import torch.nn as nn
import torch.nn.functional as F

#using_Data is MNIST

class LeNet5(nn.Module):

    def __init__(self):
        super(LeNet5, self).__init__()
        self.c1 = nn.Conv2d(1, 6, kernel_size=5)
        self.c2 = nn.Conv2d(6, 16, kernel_size=5)
        self.c3 = nn.Conv2d(16, 120, kernel_size=5)
        self.fc1 = nn.Linear(120, 84)
        self.fc2 = nn.Linear(84, 10)

    def forward(self, x):
        x = F.tanh(self.c1(x))
        x = F.avg_pool2d(x, 2)
        x = F.tanh(self.c2(x))
        x = F.avg_pool2d(x, 2)
        x = F.tanh(self.c3(x))
        x = torch.flatten(x, 1)
        x = F.tanh(self.fc1(x))
        x = self.fc2(x)
        return x

 

학습코드와 데이터 및 전체 코드는 아래 링크에 첨부👇

 

GitHub - Eumgill98/DL: 딥러닝 모델 학습 ing

딥러닝 모델 학습 ing. Contribute to Eumgill98/DL development by creating an account on GitHub.

github.com