오늘은 "특별히" 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
학습코드와 데이터 및 전체 코드는 아래 링크에 첨부👇
'ML 🐼 > 딥러닝 🔫' 카테고리의 다른 글
[논문 리뷰] CutMix : Regularization Strategy to Train Strong Classifiers with Localizable Features (2) | 2023.03.05 |
---|---|
[딥러닝]활성화 함수 (Activation) (0) | 2023.01.11 |
[딥러닝]규제 Regularization (0) | 2023.01.05 |
[딥러닝] 옵티마이저 (Optimizer) (0) | 2023.01.04 |
[논문 리뷰-CNN] 1. ImageNet Classification with Deep Convolutional Neural Networks (AlexNet) (0) | 2022.11.23 |