반응형
논문을 상세히 번역하고 한단어씩 해석해주는 포스팅은 많다.
나는 논문을 누구나 알아듣도록 쉽고 간결하게 전달하고자 한다.
VGGNet
Very Deep Convolutional Networks for Large-Scale Image Recognition
SIMONYAN, Karen; ZISSERMAN, Andrew. Very deep convolutional networks for large-scale image recognition. arXiv preprint arXiv:1409.1556, 2014.
저자의 의도
3x3의 작은 크기의 필터를 사용해서 모델의 depth를 늘려보자.
기존의 문제점
AlexNet이나 ZFNet 같은 모델들은 large scale의 이미지를 처리하는데 문제가 있다.
이미지의 복잡도가 증가하면 정확도가 나오지 않는 것.
두 네트워크 모두 더 정확한 모델을 위해 11x11의 큰 필터를 사용한다.
하지만 필터 크기가 크면 오히려 식별력이 떨어지고 파라미터 수가 너무 많다.
해결 아이디어
1. 3x3 크기의 필터 스택 활용
5x5 크기의 필터 1개 보다는 3x3 필터 2개
7x7 크기의 필터 1개 보다는 3x3 필터 3개가 더 낫다.
큰 필터 1개보다 여러개의 3x3 필터 스택이 좋은 이유는 3가지.
첫째, 더 많은 비선형을 가져온다. (더 복잡한 이해도)
둘째, 파라미터 수가 적어진다. (속도 향상)
셋째, 더 작은 영역의 특징을 감지한다. (더 복잡한 조합)
따라서 더 빠르고 정확한 식별력을 가진 모델이 된다.
2. 데이터 증강 기법
이 논문에서는 random cropping과 flip 2가지 방법을 제시했다.
random cropping은 크기가 다른 이미지를 무작위로 추출하는 방법이다.
filp은 좌우 반전으로 이미지를 뒤집는 방법이다.
이런 기법을 사용할 때는 조심 해야할 점이 있다.
기법을 사용한 뒤 이미지가 원래 이미지와 성질이 아예 다르면....
망한다. 안하느니만 못하다.
논문 구현
import torch
import torch.nn as nn
import torch.nn.functional as F
class VGGNet(nn.Module):
def __init__(self, num_classes=1000):
super(VGGNet, self).__init__()
self.cnn1 = nn.Conv2d(3, 64, 3, padding=1)
self.cnn2 = nn.Conv2d(64, 64, 3, padding=1)
self.cnn3 = nn.Conv2d(64, 128, 3, padding=1)
self.cnn4 = nn.Conv2d(128, 128, 3, padding=1)
self.cnn5 = nn.Conv2d(128, 256, 3, padding=1)
self.cnn6 = nn.Conv2d(256, 256, 3, padding=1)
self.cnn7 = nn.Conv2d(256, 512, 3, padding=1)
self.cnn8 = nn.Conv2d(512, 512, 3, padding=1)
self.maxPool1 = nn.MaxPool2d(2)
self.avgpool = nn.AdaptiveAvgPool2d((7, 7))
self.fc1 = nn.Linear(512 * 7 * 7, 4096)
self.fc2 = nn.Linear(4096, 4096)
self.fc3 = nn.Linear(4096, num_classes)
def forward(self, x):
x = F.relu(self.cnn1(x))
x = F.relu(self.cnn2(x))
x = self.maxPool1(x)
x = F.relu(self.cnn3(x))
x = F.relu(self.cnn4(x))
x = self.maxPool1(x)
x = F.relu(self.cnn5(x))
x = F.relu(self.cnn6(x))
x = F.relu(self.cnn6(x))
x = self.maxPool1(x)
x = F.relu(self.cnn7(x))
x = F.relu(self.cnn8(x))
x = F.relu(self.cnn8(x))
x = self.maxPool1(x)
x = F.relu(self.cnn8(x))
x = F.relu(self.cnn8(x))
x = F.relu(self.cnn8(x))
x = self.maxPool1(x)
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = F.relu(self.fc1(x))
x = F.dropout(x)
x = F.relu(self.fc2(x))
x = F.dropout(x)
x = self.fc3(x)
return x
옛날 논문이라 코드도 아주 간단하다.
끝.
반응형
'논문리뷰' 카테고리의 다른 글
[논문 리뷰] Vision Transformer(ViT) 요약, 코드, 구현 (0) | 2023.03.22 |
---|---|
[논문 리뷰] UNet 요약, 코드, 구현 (0) | 2023.03.20 |
[논문 리뷰] Inception v1 요약, 코드, 구현 (0) | 2023.03.16 |
[논문 리뷰] Transformer (Attention Is All You Need) 요약, 코드, 구현 (0) | 2023.03.14 |
[논문 리뷰] ResNet 요약, 코드, 구현 (0) | 2023.03.07 |