-
[논문] AlexNet(2012)AI/딥러닝 2024. 6. 25. 13:14
AlexNet
ILSVRC'12 에서 우승을 차지한 CNN 구조이다. 기존 딥러닝은 성능이 좋지 않아 인식이 좋지 않았기 때문에, 2011년 까지 우승 팀들의 방법론은 딥러닝이 아니었다.
하지만 2012년 AlexNet의 등장으로 딥러닝의 인식이 제고되었고, 이후 딥러닝 기법이 주류가 되었다.
AlexNet의 구조
5개의 Convolution Layer, 3개의 Fully-connected 레이어 총 8개의 레이어로 구성되어 있다.
두 블록으로 나뉘어 있는 것을 볼 수 있는데, 2개의 GPU로 병렬연산을 수행하기 위해 이렇게 설계되었고, 3번째 Convolution Layer은 이전 단계 두 채널의 Convolution Layer와 모두 연결되어 있다는 점만 알고 넘어가자.
Architecture
1. ReLU
논문에선, Tanh, 시그모이드 함수와 ReLU(max{0, x})를 비교했다.
ReLU함수는 두 함수와 비교해서 매우 단순하게 생겼고, 양수에서, 기울기가 줄어드는 부분이 없다.
따라서, 학습 속도가 빠르고(Tanh에 비해 6배 빠른 학습 속도) 기울기 소실 문제를 해결했다.
2. Local Response Normalization
최근에는 자주 사용하지 않는 normalization 기법으로, 시그모이드, Tanh 함수는 1~0의 값을 출력하는 반면 ReLU는 양수에서 값을 그대로 반환하기 때문에 pooling층에서 너무 큰 값에 영향을 받을 수 있어 normalization 해준다.
3. DropOut
과적합을 막기 위해 dropout을 사용했다.
fully connect layer에서 사용했고, 정해진 비율에 따라 몇개의 뉴런의 값을 0으로 비활성화 시켜 순전파와 역전파에 영향을 미치지 않게 만든다.
4. Data augmentation
과적합을 막기 위해 원본 사진을 변형시키는 기법을 사용했다.
사람을 기준으로 보자면, 같은 사진을 변형시켜 중요한 특징만(사진에서는 고양이에 해당하는 부분) 인식할 수 있도록 한다.
마지막으로, 논문에서는 모델의 깊이가 고성능을 위한 필수라고 말하며 마무리했다.
코드
class AlexNet(nn.Module): def __init__(self, num_classes = 1000, dropout = 0.5): super().__init__() self.feature_extractor = nn.Sequential( nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2), nn.ReLU(inplace=True), nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75, k=2), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(inplace=True), nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75, k=2), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), ) self.classifier = nn.Sequential( nn.Dropout(p=dropout), nn.Linear(256 * 6 * 6, 4096), nn.ReLU(inplace=True), nn.Dropout(p=dropout), nn.Linear(4096, 4096), nn.ReLU(inplace=True), nn.Linear(4096, num_classes), ) def forward(self, x): x = self.feature_extractor(x) x = x.view(-1, 256 * 6 * 6) x = self.classifier(x) return x
'AI > 딥러닝' 카테고리의 다른 글
[논문] VGG (2014) (0) 2024.07.30 [논문] GoogLeNet (Inception v1) (2014) (0) 2024.06.26 AlexNet feature map 추출하기 (0) 2024.06.25