ImageNet Classification with Deep Convolutional Neural Networks, NIPS 2012
잘 알려진 CNN network들은 다음과 같은 순서로 발전이 되어 왔습니다.
그중 AlexNet의 경우는 2012년 lLSVRC라는 챌린지에서 우승을 했습니다.
AlexNet을 기점으로 deep neural network가 개발되기 시작했고, 이후에 ZFNet, VGG, GoogleNet, Restnet 으로 넘어오면서 layer가 152개가 쌓일 정도로 deep natework를 만들었습니다.
그래서 더 복잡한 high level 시멘틱스를 인코딩 할 수 있는 네트워크가 만들어 지게 됩니다!
A very simple CNN architecture introduced by Yannl LeCun in 1988
Overall architecture : Conv-Pool-Conv-Pool-FC-FC
- Convolution: 5x5 convolution filters with stride 1
- Pooling (i.e., sub-sampling): 2x2 max pooling with stride 2
우선.. CNN Network의 가장 가장 최초라고 할 수 있는 LeNet에 대해서 먼저 알아보겠습니다. Input Image가 있으면, input image의 어떤 convolution을 통과 시키고 또 Subsampling을 해서 이미지 사이즈를 줄이고, Convolution을 돌리고 pooling을 해서 fully connected layer를 통과 시켜서 output을 만드는 현대의 CNN network의 전반적인 구조라고 할 수 있는 것을 당시에 제안을 했습니다.
근데 이때 당시 문제점은 GPU가 없었죠.. 병렬 컴퓨팅이 불가능 해서 다소 오래 걸렸을 것이고, 그리고 여러가지 세부적인 batch norm 이라든지 이런 기술이 없어서 당시에는 크게 각광 받지 못했지만, 이것을 다시 부활 시킨 것이 AlexNet 입니다!
- LeNet-5 vs
- Bigger (7 hidden layers, 650K neurons, 60millions parameters
- Trained with a larger amount of data → ImageNet
- Using better activation function (ReLU) and regularization technique (dropout)
7개의 hidden layer가 있고, 65만개 정도의 뉴런, 6천만개 정도의 모델 파라미터가 있습니다. 그리고 Lenet과는 달리 큰 데이터로 Training이 되어 있습니다. 바로 lmageNet, large scale dataset으로 학습이 되었습니다.
그리고 더 좋은 activation function과 regularization technique을 사용하였습니다. gradient vanishing을 막기 위해서 non-linear 함수인 relu function을 사용하였습니다.
📎 gradient vanishing gradient가 점점 작아져 가중치 매개변수가 update 안되는 경우
overlapping pooling을 통해 에려율 감소 및 과정합 방지를 했습니다.
또 dropout을 통해서 정규화를 해 model의 flexability도 높이면서 일반화 가능성도 더 강화시킨 모델이라고 할 수 있습니다 !!
Overall architecture :
Conv-Pool-LRN(local response normalization)-Conv-Pool-LRN-Conv-Conv-Conv-Pool-FC-FC-FC
전체적인 아키텍처입니다.
근데 LRN이 뭐임
AlexNet에 !!처음 도입 된 기법 => 인접 화소 억제 + 특징 부각
이 사진을 보면 회색 점이 보이는데, 강한 검정색이 약한 흰색을 막아 발생하는 Lateral Inhibition 에 의해 발생하는 것 입니다.
그래서 이걸 왜 씀
바로 ReLU 녀석 때문.
ReLU는
양수 방향에서는 입력값을 그대로 사용하는데, 그럼 Conv or Pooling 할 때 높은 하나의 픽셀이 주변 픽셀에 영향을 미치게 됩니다.
그래서 다른 ActivationMap의 같은 위치에 있는 픽셀끼리 정규화를 해줍니다.
이번에는 torchvision을 활용해서, AlexNet 한번 살펴 보겠습니다.
features를 먼저 보면 Conv, ReLU, MaxPool ... 들이 구성이 되어 있습니다.
처음에 11x11 커널 통과해서 stride 4 짜리로 해상도를 줄여주고, 다음에 5x5, 3x3 이런식으로 구성이 됩니다. 마지막에 avgpool 로 전체 스페셜 사이즈를 한번에 줄여줘서 하나의 백터만 남기도록 합니다.
다음에 classifier 를 통과시켜 dropout을 시켜줍니다. 최종적으로 linear에서 최채널수를 4096, 이미지 클래스 개수인 1000개로 줄여주게 됩니다.
pytorch official 을 참고해서 봅시다요.
모든 pretrain model 은 이미지가 노멀라이즈가 되어 있는데, RGB 가 동등한 비율로 들어갈 수 있도록 스케일링 해주는 것 입니다.
그래서 여기 있는 0.485 이런 값들이 이미지넷 데이터의 평균 값 입니다. 즉, 이 값이 이미지넷에 대한 노멀라이즈 값 입니다.
그럼 위에 살펴 본 내용을 바탕으로 간단한 실습 해보겠습니다.
우선 이미지는 PIL로 읽어주고 PLT 로 visualize 해줍니다.
이미지는 numpy array니까!! pytorch tensor로 바꿔주고 노멀라이즈를 해줍니다. 그리고 네트워크에 넣기 위해서 b,c,h,w 순으로 쉐입을 바꽈줍니다.
ImageNet의 pretrain model을 가져와봤습니다.
여기서 잠깐.
이 논문이이 처음에 알렉스 넷 테크니컬이 제안 된 논문입니다. https://arxiv.org/abs/1404.5997
당시에 gpu로 병렬연산을 하는 기술이 없었는데, gpu를 통해서 학습시킬수 있다는 것을 제안했던 논문입니다. 그렇게 Syncronization이나 batch size.. 라던지 이런 것들은 이 논문에서 처음 제안했다고 합니다.
아무튼 alexnet = models.alexnet(pretrained=True) 여기서 True 만 주면 자동으로 pretrain 된 모델을 가져올 수 있게 됩니다.
단 eva()을 하면 Evaluation 모드로 weight를 프리즈 하게 되겠죠?
그래서 학습이 안됩니다.
forward를 해보겟습니다. 아까 집 사진인 torch.Size([1, 3, 1135, 1920]) 이미지를 알렉스 넷에 넣습니다. 내부에 포워드 함수가 구현이 되어 있어서 통과가 되고,
아웃풋으로 어떤 1000개 짜리 로짓이 나오게 됩니다!
print(torch.argmax(logit)) 을 해보면 660번 째 클래스라고 예측이 나오는데,
이미지 넷 클래스 660 번째 와 확인을 해보면 Home으로 맞춘 것을 확인 할 수 있습니다 !!
AlexNet 끝~~
처음 논문 리뷰여서 다시 보니 굉장히 미흡한 부분이 많네요 ..
그치만 앞으로 성장하는 모습....ㅎ