[논문 구현] 근본을 찾아서... 0. LeNet-5 (GradientBased Learning Applied to DocumentRecognition)
오늘은 "특별히" 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