cnn은 depth가 깊어지고 넓어질수록 overfiting 문제가 빠질 가능성이 높다. 그동안 hyper-paramenter와 초기값 설정을 통해 극복. 하지만, 연산량의 증가등의 문제로 고가의 좋은 시스템에서만 작동.
이런 단점을 어느정도 해결, 즉, 다양한 실험을 통해 깊어지고 넓어지지만, 연산량을 유지.
GoogleNet 핵심
inception module
파란색 부분를 통해 scale feature 효과적 추출
1x1 convolution :
이 부분에서 연산량을 줄임으로써, depth width들을 높일수 있는 계기
연산량을 줄일수 있다는 말은 channel수를 줄인다는 의미 > NIN 논문 참조
22개의 layer
총 9개의 inception 모듈 (밑의 빨간색 동그라미 - 숫자는 feature-map 수)
빨간색 - max pooling
노란색 - softmax
detail 구조
첫번째줄은 convolution(conv) 연산이 의미 즉, 7x7 kernel(receptive field) 의 2 stride 연산이고, output 즉, feature map에 대해 112x112 크기의 64개의 개수을 얻었다는 의미가 된다. depth는 1이면 단독으로 conv 있다는 의미(inception module이 아니라는 뜻)
depth가 = 2인뜻은, conv가 연속적으로 두번 있다는 의미이며, inception module연관이 깊다는 의미가 된다.
depth가 2개 나오는 첫번째만 제외하고 inception module이다.
위의 첫번째 그림의 구조 참조해라
1x1 kernel : 위의 그림 3(a) 에서, 64의 의미는 이전 layer에서, 192개를 input 으로 받아서 64개 feature map을 얻었다는 의미 이며, 곧 reduction(192->64)했다는의미가 된다.
위의 링크로부터 설명이 되어 있지만, 3x3 kernel 이전에 1x1 kernel를 사용한다.
3x3 reduce : 그니까, 3x3 kernel 앞쪽에 있는 1x1 kernel
3x3: 1x1뒤에 있는 3x3 kernel
이후도 이런식으로 이해하면 됨.
param : parameter의 수
ops : 연산수
이는 V1 구조를 설명이며, 이후, V2, V3구조가 나온다(시간되면~)
구조가 일반 cnn(vgg, alexnet..)과 다르게 구조가 복잡하며, 이로 인해 다양한 응용분야에 적용하기 어려운 구조, 실제적으로 localization등의 응용 구조에서 googlenet이 쓰이는 경우는 거의 보지 못함 왜일까?
https://arxiv.org/abs/1409.4842