Link
09-25 13:23
«   2020/09   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
Archives
Today
939
Total
1,023,685
관리 메뉴

꿈 많은 사람의 이야기

cs231n 2017년 강의 9강 CNN Architectures 정리 본문

deep learning(딥러닝)

cs231n 2017년 강의 9강 CNN Architectures 정리

이수진의 블로그 이수진의 블로그 2018. 11. 28. 10:09

안녕하세요. 날씨가 많이 춥네요.

오늘은 딥러닝 영상 기반 강의인 스탠포드(stanford) 대학교 cs231n 2017년 강의 9번쨰 강의 정리입니다.

지난 시간에 7강까지 하고 8강은 넘어갔었는데요. 8강은 여러 딥러닝 software들을 소개해줍니다. 혹 궁금하신 분들이 있으시면 봐보세요!





이번 9강은 여태 나왔었던 훌륭한 CNN 모델들을 소개해줍니다.



AlexNet(알렉스넷), googLeNet(구글넷), VGG Net, ResNet(레즈넷) 등을 소개하는 강의입니다.

이런 모델들은 imagenetlocalization 대회에서 우수한 성적을 거둔 모델입니다.




LeNet은 가장 초창기 CNN 모델이죠.

그리고 연구가 좀 더 되서 2012년이 되었습니다.

그 전에는 사람이 수작업을 하거나 그랬었는데요. 2012AlexNet이 나오면서 매년 2~3%씩 줄었던 오차가 갑자기 10%넘게 줄게 만들어서 엄청난 화제거리가 되었습니다.

그때 이후로 영상 인식 특히 CNN이 기하급수적으로 발전하게 되었죠.


AlexNet부터 알아보도록 합니다.

 

알렉스넷의 아키텍처는 Convolution layer -> max pooling -> normalization 으로 이루어져 있습니다. normalization은 요즘은 쓰지 않습니다. 이게 AlexNet이 나온 이후로 그렇게 필요하지 않다. 라고 연구가 되었기 때문이에요



여기서는 output size(volum)parameter 개수를 유심히 보시면 됩니다.

이런 size와 파라미터 개수가 모델의 큰 영향을 주기 때문이죠. 아무래도 연산량과 관련이 많게 되니까요!

첫 번째 layer를 보죠. 이게 지금 그림은 input224이고 글에서는 227이라고 나와있는데요. 227이 맞습니다. 오타입니다. 224.

자 여기서 input을 통해 나오는 output size는 어떻게 될까요?

Conv111x11 filterstride4입니다.




그럼 계산을 해보면 (227-11)/4 + 1 = 55가 됩니다. 그리고 96개가 있으니까 55x55x96이 되겠죠

 

그럼 파라미터의 총 개수는 어떻게 될까요?



파라미터 개수는 11x11x96*3이 되겠죠. 이걸 계산하면 34848이 나오는데 대략 35K입니다. K1000이니까요.



그럼 2번째 layer에서 output volumn size는 몇일까요? 2번째 layerpooling layer입니다. 앞에서 55의 크기가 들어왔죠? 그리고 여기 filter3x3입니다. Stride2구요. 그래서 (55-3)/2 + 1 = 27이 되겠죠.



그래서 27*27*96이 됩니다. 96개의 필터를 가지고 있으니까요.

그럼 여기서의 파라미터 개수는 어떻게 될까요?



0입니다. 0일까요? Pooling은 단순히 큰 값을 뽑아내는 등 size를 작게 해줄 뿐이지 뭔가 계산을 한다거나 그런게 아닙니다.




즉 이렇게 output size를 계속 계산해볼 수 있습니다



AlexNet의 전체 레이어(전부는 아니지만)를 보시면 이렇게 됩니다. 여기서 요즘은 Normalization layer는 잘 쓰지 않습니다. 끝을 보면 FC6Fully Connected layer가 있습니다



AlexNet의 특징은 옆에 파란색 글씨와 같은데요.

ReLU를 사용했습니다. 처음으로 사용했죠. 그리고 앞선 강의에서 배운 data augmentation을 많이 사용했습니다. 논문을 보면 flipping, jittering, color norm 등을 사용했다고 합니다.

그리고 dropout 사용했고 batch 방법으로 했습니다.

초기 learning rate1e-2를 사용했고 val accuracy가 올라가지 않는 지점에서는 학습이 종료되는 시점까지 learning rate1e-10까지 점차 줄여나갔다고 합니다.

그리고 weight decay를 사용했다고 하네요. Weight decayregularizatino의 방법입니다. weight들의 값이 증가하는 것을 제한해서 보델의 복잡도를 감소시켜 제한하는 것이죠.

그리고 앙상블을 사용했다고 하네요.



그리고 다음페이지에 여기 파란색 네모가 쳐지는데요. 모델이 2개로 나뉘어져서 서로 교차하는데요. 앞서 우리는 파라미터를 계산할 떄 96개라고 뭐 했지만 사실 48개씩 나눠집니다.

이건 이 당시 시대에는 GTX950으로 학습시켰는데 이건 메모리가 3G뿐이라고 합니다. 그래서 메모리 용량이 안되어서 2개로 나뉘었다고 하네요. 2개로 분산시켜서 넣었다고 합니다.

근데 이게 재밌는게 요즘 이 기법들을 많이 사용합니다. 데이터는 많고 메모리는 한계가 있으니까 아무리 그래픽카드(GPU)가 좋아져도 한계가 있는 것이죠. 그래서 대용량으로 모델을 만드는 곳에서는 이러한 기법을 많이 사용한다고 합니다.



여기서 CONV1,2,45 레이어에서는 어떤일이 벌어질까요?? 여기서는 서로 나뉘어진 값을 보기 때문에 같은 GPU내에 있는 feature map 만 봅니다. 전체를 볼 수 없죠. 처음에 나뉘어진 48개의 feature만 봅니다



하지만 6,7,8은 어떤가요? 여기는 전체 feature map과 연결되어 있습니다. 여기서는 gpu간의 통신을 하기 때문에 이전 입력 레이어의 전체 depth를 가져올 수 있습니다



알렉스 넷은 2012imagenet에서 우승을 했고 최초의 CNN기반 우승 모델입니다. AlexNet의 시작으로 CNN 발전이 증가했으며 사람들은 transfer learningAlexNet으로도 많이 사용했습니다



실제로 이 다음년도의 ImageNet의 우승자 ZFNetAlexNet의 파라미터 값만 바꿔서 출전했는데 우승을 할 정도였죠.



사실상 기반은 AlexNet인데 위 처럼 CONV1의 크기와 stride가 바뀌었고 CONV3,4,5도 바뀌었습니다.



그러다가 2014년에는 많은 변화가 발생하게 되죠. 일단 네트워크가 깊어집니다. 엄청 깊어졌죠.

그리고 우리가 흔히 알고 있는 VGG, GoogLeNet, ResNet 등이 여기서부터 나오게 됩니다.

 

2014년도의 우승자는 GooLeNet입니다. 2등은 VGGNet이죠. 하지만 이 2개다 매우 우수하기 때문에 2개다 살펴봅니다.



먼저 VGGNet부터 보죠.


AlexNet에서는 8개의 layer를 가지고 있었습니다. 하지만 여기서 보면 16-19layers를 가지고 있죠. Layer가 확 늘었죠?

그리고 오직 3x3 conv만 사용했습니다. Stride1이고 pad1입니다. 그리고 2x2 max poolstride2로 해서 사용했죠.

 



자 그럼 여기서 왜 3x3을 사용했을까요?



이렇게 됩니다. 3개의 3x3 conf(stride1)을 사용하면 마치 7x7의 효과를 주게 됩니다.

 

이게 왜냐하면 


이렇게 되는데 이게 receptive filter라고 불리웁니다.

1개의 영역을 볼 때 3x3을 해서 보죠. 그리고 3x3을 해서 나온 영역을 또 다시 하나의 영역을 보면 3x3을 해서 보게 됩니다. 그럼 이게 5x5의 효과가 나오게 되는 것이죠. 이걸 3번 하개 되면 7x7이 되겠죠?? 그래서 이런 효과가 있는 것입니다.




그래서 3x3을 3개 쓰는 것입니다.



그럼 이렇게 해서 얻는 이득이 무엇이냐??? 한 번 계산을 해봅시다.


기존에는 7x7 사이즈니까 기본적으로 7x7이 들어갑니다.

그리고 depth가 있는데 이걸 C로 보죠. Input CoutputC가 있는데 얘를 동일하게 해주려고 합니다. 그러면 C*C가 되겠죠.

결국 기존에는 7x7xCxC가 되서 7^2 * C^2가 됩니다.

 

근데 저렇게 3x3으로 바꿔주면??  (3^2 * C^2) * 3(3개니까) 이렇게 되죠.

그럼 49C^2 27C^2이 됩니다. 훨씬 줄어들죠. , 같은 효과를 내는데 파라미터 수는 줄어든다는 것입니다! 매우 놀랍죠.



자 이제 전체 파라미터를 보시면 이렇게 됩니다. 이거 계산이야 앞에서 해봤던 것 사용하시면 금방 구합니다 ㅎㅎ

단지 좀 봐야할 것이 마지막에 있는 FC layer를 보시면 파라미터가 1억개가 넘어갑니다. 좀 많죠? 이걸 나중에 개선하려고 하는데요. 알아두시면 좋습니다.




그리고 total memory24M * 4니까 96MB가 필요합니다. 하나의 이미지당입니다. 근데 이게 forward에서만 계산한 것입니다. 좀 무겁죠?

VGG는 메모리 사용량이 많은 단점이 있습니다.

만약 전체 메모리가 56G면 이미지 하나당 100MB정도 되니까 50장 밖에 처리를 못하는 것이죠 ㅠㅠ 너무 심각하죠..

그리고 전체 파라미터 개수는 138M입니다. AlexNet60M이었죠. 개수가 확 늘었습니다



VGG를 보면 가장 많은 메모리를 사용하는 곳은 CONV3입니다. 그리고 앞서 말씀드린대로 가장 많은 파라미터를 사용한 곳은 첫번쨰 FC layer.

나중에 보겠지만 최근에는 이걸 아예 버리는 경우도 있습니다. 개수를 줄이려고요.



그리고 그냥 tip으로 알아두셔야 할 것이 layer마다 이름이 이렇게 붙습니다.




VGG를 요약하면 localizatino에서는 1등을 했고 ImageNet에서는 2등을 했습니다.

그리고 VGG 16, 19가 있습니다. 19layer도 깊고 더 많은 메모리를 소모하죠.

그리고 마지막에 있는 FC7 layer부근은 매우 generalize가 잘되어 있습니다. 즉 좋은 feature representation을 가지고 있습니다. 다른 데이터에서도 특징(feature)추출이 잘 되고 다른 task에서도 일반화 능력이 뛰어난 것으로 알려져있습니다



이제 GoogLeNet을 보죠.



구글넷은 2014classification challenge에서 우승한 모델입니다. 이것도 깊은 네트워크를 가지고 있죠. 22layer입니다. 구글넷에서은 큰 계산량을 효율적으로 처리했다는 것이 특이합니다.

파라미터 개수만 봐도  5M뿐이 안됩니다. VGG와 차이거 어마어마하죠? 심지어 AlexNet보다 개수가 없습니다



구글넷에서는 inception module을 사용한다고 합니다. Inception은 영화 인셉션에서 따온 것이라고 하네요. 아 그리고 googLeNet에서 Le LeNet을 만든 사람을 기리면서? 만들었다고도 합니다.

뭐 아무튼..

그리고 구글넷의 특징 중 하나는 FC layer가 없습니다. 파라미터를 줄이기 위해서죠.



그렇다면 이 핵심이 되는 inception module에 대해서 알아봐야겠죠?

이들은 좋은 로컬 네트워크를 만들고 싶었습니다. 그래서 네트워크 사이에 있는 네트워크 라는 개념으로 local topology를 구현했고 이를 쌓아올렸습니다.

local networkinception module이라고 부릅니다.

 

보시는 바와 같이 inception module 내부에는 다양한 필터들이 병렬로 존재합니다. 다양한 conv 연산을 진행해서 이걸 나중에 depth 방향으로 concate되는 것이죠. 즉 합쳐지는 것입니다. 여기서 합쳐지면 어떻게 될까요?



이렇게 4개의 채널이 합쳐지니까 4C가 됩니다




근데 이건 써져있는 것처럼 naïve한 방식입니다. 이게 문제점이 있는데요.

바로 어마어마한 연산량(계산 비용)이 문제가 됩니다






자 만약 이렇게 되어 있으면 출력은 어떻게 될까요참고로 zero padding이 되어 있는 상태입니다.



처음에 1x1 conv를 하면 28x28x128이 됩니다. 여기서 중요한점!! 1x1 conv layer의 장점입니다.

 1x1은 말 그대로 크기가 1인데요. 하나하나 보기 때문에 w, h는 변하지 않습니다. 그런데 depth가 줄어들죠? 이걸 꼭! 기억해주세요.



그리고 다음 3x3conv를 사용하면 어떻게 될까요



Zero padding을 사용했기에 shape는 변하지 안습니다대신 depth만 변하죠. 5x5도 마찬가지입니다.


그리고 맨 오른쪽의 poolingstride1이라서 크기가 줄어들지 않습니다. 그래서 blur효과가 있다고 합니다. 이게 뭐냐면 좋은 것만 끄집어 내는 것입니다.

예를 들어 5x5 영역에서 특정 3x3 pooling layerstride1개씩 보면서 간다고 합시다. 그러면 여기서 max pool을 쓸탠데 높은 숫자가 겹쳐서 나올 수도 있는 것이죠?


이렇게 좋은 숫자가 연속으로 나올 수 있습니다. blur효과를 낼 수 있는 것이죠. 아무튼!

 

여기서도 결과 값은 28x28x256이 됩니다



문제는 이걸 마지막에 concate한다고 했죠 합치게 됩니다. 그럼 output size는 어떻게 될까요?



W,h는 같으니까 channel이 합쳐집니다. 28 x 28 x (128+192+96+256)이 됩니다.

28x28x672가 되죠. 갑자기 output의 크기가 확 커집니다. input에서는 256이었으니까요.

그럼 이 값이 다음 layerinput으로 들어가고.. 그럼 점점 커지고 그렇게 되겠죠?



그리고 conv의 개수를 세어보면 오른쪽 처럼 854M의 값이 나오게 됩니다

1 x 1 x 256은 하나의 픽셀당 계산하는 양이구요, 28x28은 총 픽셀 개수, x128은 필터 개수죠.



이렇게 어마어마한 양이 나오게 됩니다.

계산을 하는데 있어 매우 비싸지는 것이죠.

 

이게 왜냐하면 depth가 점점 깊어지기 때문입니다. concate하면서 depth가 굉장히 깊어지죠



이 문제를 해결하려면 bottlenect layer를 이용하여 해결합니다. 입력을 낮은 차원으로 보내는 것이죠.

 

아까 제가 강조드렸던 1x1Conv를 보면 w,h는 유지하면서 depth는 감소시킬 수 있었죠? 그렇게 1x1 Conv를 이용해서 입력을 낮은 차원으로 보내줍니다!



여기서 그림처럼 1x1conv를 하면 depth를 줄일 수 있는 것이죠



이렇게요.



그래서 inception module에서 1x1 conv를 추가합니다



1x1 conv bottleneck를 추가하는 것이죠. 그럼 다시 연산량을 계산해볼까요??



Total356m이 나왔습니다. 아까보다 확 줄었죠?

이런식으로 1x1conv를 활용하면 계산량을 줄여줄 수 있습니다.

근데 여기서 1x1 conv를 수행하면 정보 손실이 없을까요?? 발생할 수 있다고 합니다. 근데 동시에 redundancy가 있는 input features를 선형 결합을 하고 non-linear를 추가하면 네트워크가 더 깊어지는 효과가 있어서 여러모로 도움이 된다고 합니다.



아무튼 그래서  gooleNet은 이러한 inception module을 쌓아서 올리게 됩니다.



여기서 더 깊게 보려고 전체 googlenet을 가져왔습니다. Pt 크기가 안맞아서 돌렸다고 하네요

초기 앞단(stem network)는 일반적인 네트워크구조라고 합니다.

 


 


이후에는 inception modules이 쌓이게 되죠.



마지막에는 classifier를 합니다. 구글넷에서는 계산량이 많은 FC-layer를 대부분 걷어냈고 파라미터가 줄어도 모델이 잘 동작됨을 확인했습니다



여기서 마지막에 fully connected 대신에 global average pooling을 사용하였다고 합니다. 이게 뭐냐면요 예를 들어 여기까지 오기 전에 7x7x1000이 왔다고 가정합니다. 파란색 태두리 마지막에 있는 하늘색까지 왔을때요.

이걸 전부 global하게 pooling을 하는 것입니다. 그러면 1x1x1000이 된다고하네요.

그리고 이 상태에서 바로 classification이 가능하다고 합니다.

왜 이렇게 하냐면 앞에서 효과적으로 feature-vector를 추출하였기 때문에 이렇게 추출된 vector들에 대한 pooling만으로도 충분하다고 생각했기 때문입니다.

그렇기에 많은 파라미터 수가 급감했구요 overfitting도 방지가 된다고 합니다.

 

그리고 나서 FC layer를 거쳐서 softmax를 하게 됩니다.



그리고 옆에 꼬다리마냥 튀어나와 있는 애들은 뭘까요? 이건 보조분류기(auxiliary classifier)라고 합니다. 이것은 미니 네트워크 입니다. Average pooling도 있고 fc도 붙습니다. 그리고 softmaxclassification도 하죠. 그리고 실제로 이곳에서도 loss를 구한다고 합니다


이걸 왜 해줄까요? 그 이유는 네트워크가 깊어서입니다. 즉 네트워크가 너무 깊기 때문에 gradient를 잃어버릴 수가 있는 것이죠. 그래서 이 보조분류기를 통해 추가적인 gradient를 얻을 수 있고 중간 레이어의 학습을 도울 수 있는 것입니다.



이건 전체 아키텍처의 모습입니다.



가중치를 가진 레이어는 총 22개입니다.

FC layer는 없고 inception module를 사용합니다.



이제 ResNet으로 넘어갑니다.



ResNet2015년도의 우승자입니다. ResNet은 레이어가 엄청 깊습니다. 152정도 되죠.

ResNet은 다른 모델과 좀 다른데요. 바로 residual connection을 사용합니다. 왜 이걸 사용하게 되었을지 고민해보죠



이 모델을 만든 사람들은 레이어를 깊게 쌓으면 모델 성능이 좋아지지 않을까? 라는 고민을 했다고 합니다. 근데 그렇지 않았죠.



여기 그래프를 봅시다. 56 layer를 쌓았는데 20layer보다 성능이 좋지 않습니다. 그럼 여기서 깊은 레이어는 안좋다!’라고 생각해볼 수 있겠지만 막상 test를 보니까 이상하죠



일반적으로 레이어가 깊으면 overfitting이 나올 가능성이 높다고 생각합니다. 근데 여길 보면 overfitting 이 아니죠? 왜냐하면 test error가 높더라도 train error는 낮아야 하는데 이거는 그런 상황이 아닙니다. 파란색 글씨에도 나와있지만요.



그래서 이 RestNet을 만든 사람들이 한 가지 가설을 세웁니다. 더 깊은 모델을 학습시 optimization에 문제가 생긴다고 가설을 세웠죠.



모델이 깊어질수록 최적화 하기가 어려워진다는 것입니다.

이 사람들은 모델이 깊다면 적어도 얕은 모델 만큼은 나와야 하지 않는가?라고 생각했다고 합니다. 예를 들어서 얕은 모델의 가중치를 깊은 모델 안에 복사를 합니다. 그리고 나머지는 그냥 identity mapping을 하는거죠(inputoutput으로 내보냄) 이렇게 하면 적어도 얕은 모델 만큼의 성능이 나온다 라고 생각하는 것입니다. 이러한 방법을 모델에 녹이려면 어떻게 할까요?

이들은 좀 독특하게 접근했습니다.


기존 모델에서는



이렇게 접근이 되었었죠. 이걸 residual mapping을 하도록 이렇게 모델을 쌓습니다.

그리고 레이어가 h(x)를 학습하기 보다 h(x) – x를 학습할 수 있도록 만들어줍니다.


좀 더 정확하게 보면



이렇게 되는 것인데요.

H(x) – x activation을 거친 결과 원본 인데 이게 만약 0이 되면 차이가 거의 없다 라고 생각하는 것이죠. 예를 들어 고양이 개 라고 하면 0.8이 나오지만 포메라니안 개 하면 0.02 뭐 이렇게 나오는 것이죠.

 

그럼 왜 h(x) – x가 되냐?? 앞의 x -> w -> activation functionfx라 합니다.

그러면 출력이 h(x)니까 h(x) = f(x) + x 의 식이 되죠?? 원본을 더하니까요. 근데 우리가 구하는 것은 f(x)잖아요? 그래서 h(x)f(x)의 위치를 바꿔줍니다.

그러면 f(x) = h(x) – x가 되는 것이죠!!


 



그래서 오른쪽 고리 처럼 입력을 ideintity mapping으로 그대로 출력단으로 내보냅니다.

그러면 실제 레이어는 변화량(delta)만 학습하면 되죠. 입력 x에 대한 잔차(residual)이죠.



그래서 최종 출력값 h(x) input(x)값 즉 f(x)+ x(residual)이 나오겠죠!


이 방법을 하면 학습이 훨씬 쉬워집니다. 만약 input = output인 상황이면 레이어의 출력인 f(x)0이어야 하므로(residual = 0) 모든 가중치를 0으로 만들어버리면 되죠.

저도 아직은 공부가 부족해서 그런지 이해가 잘 안되네요.

구글에 RestNet 치면 좋은 자료들 많습니다. 꼭 읽어보시구 저도 ResNet은 공부 다시 해봐야겠어요

 

그냥 간단히 보면 h(x)를 직접 배우는 대신 x에 얼마의 값을 더하고 빼야 할까?(residual)을 배우는 것입니다. 그니까 h(x) = f(x) + x이니까 f(x)를 학습 시켜보는 것이죠. F(x)residual입니다



여기 전체 아키텍처가 나와 있습니다. 하나의 Residual block3x3 conv layer로 되어 있습니다. 그리고 이 residual block을 깊게 쌓죠



그리고 주기적으로 필터를 2배씩 늘리고 stride2로 두어 downsampling을 진행합니다.

 



모델의 끝에는 fully connected layer가 없고 대신  global average pooling layer를 사용합니다.

Global average pooling layer는 앞서 설명했었죠.

그리고 단지 1000개의 이미지 분류를 위한 FC layer가 있을 뿐입니다



34, 50, 101, 152layer의 종류가 있습니다.



여기서도 마찬가지로 bottlenect을 사용합니다

이게 resnet layer50개가 넘어가면 보통 bottle neck을 사용한다고 합니다. 그렇지 않으면 사용안하고 그냥 3x3 layer를 반복한다고 하네요.


왜냐하면 50, 101, 152 layer는 파라미터가 급격히 증가하기 때문입니다.



그래서 1x1로 먼저 차원을 줄여주고 다시 3x3에 넣어주고 여기서 다시 1x1을 해줍니다

처음 1x1은 차원을 줄여주는 것이구요(계산량 감소) 그리고 3x3을 통과시킨 다음 1x1을 해줄 때는 차원을 다시 증가시켜주는 것입니다

여기 그림을 보면 256 -> 64 -> 64 -> 256 -> 256이 되죠? 다시 증가시켜주는 것입니다

이건 그냥 적은 수로 똑 같은 결과를 만들어보자~ 라는 아이디어 라고 하는데요

저도 왜 줄였다가 늘려주는지는 정확하게 모르겠네요. 차원이 급 줄어서 그런건지..



실제로 ResNet은 모든 Conv layer다음 Batch Normalization을 한다고 합니다. 그리고 초기화는 Xavier를 사용하는데 2로 나눈 것을 사용합니다. 아마 ReLU에 동작이 되길 원해서 그런거겠죠?

 

그리고 learing rate0.1로 하다가 loss가 줄어들지 않으면 줄여주는 방식을 사용했다고 합니다.

 

! 그리고 이 + 때문에 back propagation에도 좋은 영향을 미친다고 합니다. Backprop을 할 때 + 부분이 연결되어 있어서 기울기가 손실이 안된다고 하네요!






그래서 뭐 2등이랑 엄청난 격차를 토대로 이겼다고 하네요그리고 네트워크가 깊어질수록 training error는 줄어들었다고 합니다.



자 그럼 이제 모델별 복잡도를 비교해볼까요?




왼쪽 그림은 모델별로 정확도를 그려놓은 것입니다. Inception-v4가 제일 좋죠이게 아마 gooLeNet + ResNet모델일겁니다버전별로 있는 것이죠.




그리고 오른쪽은 복잡성을 따져봅니다. y축은 정확도고 x축은 복잡도죠(연산량)

 

VGG가 드럽게 복잡하나 보네요 ㅎㅎ 



제일 무난한게 inception모델들 ResNet 모델들이네요.



알렉스넷은 워낙 좀 된 모델이라저기 구석에 있네요 ㅠㅠ



무난한 ResNet



그리고 forward pass timepower 소모량을 말하는데요

VGG가 역시 안좋네요

 

나중에 더 자세히 보세요~ 간단하게 넘어가겠습니다.



그리고 나머지는 그 외 다른 몇가지 모델입니다



다른건 모르겠고 알아두셔야 할 것은 2016년에 나온 ResNet 모델입니다. 이건 15ResNet 모델과 다른 것인데요.


15년도에는 이렇게 했던 것을


이렇게 된 것이죠. Direct path를 늘려서 성능을 향상시켰습니다



그리고 이렇게 F, K를 넣어서 wide residual network도 있습니다. 기존 ResNet은 깊게 쌓는것에 열중했지만 이들은 residual에 집중한 것입니다. 이들은 residual block을 넓게 만들었죠. 기존의 ResNet에는 F개의 filter만 있었다면 F * K개의 필터로 구성했습니다.

이렇게 하니까 50 layer만 있어도 residual block을 깊게 했으니 성능이 더 좋게 나왔다는 것을 입증했죠.

그리고 이렇게 하면 추가적인 장점이 계산 효율이 증가하게 되는데요. 병렬 처리가 가능하기 때문에 그렇습니다.



그리고 ResNeXt도 있는데넘어가겠습니다.



Stochastic depth도 있는데요 이건 마치 dropout을 연상시켜주는 것입니다. 참신한 아이디어이죠.



나머지는 넘어가겠습니다.



이렇게 스탠포드 대학교 cs231n 2017 9강을 정리했습니다.

 

수고하셨습니다.

2 Comments
댓글쓰기 폼