안녕하세요. 솩코딩입니다.
오늘은 CNN(Convolutional Neural Network)에 대해 공부했던 내용을 공유하겠습니다.
(필터링하는 과정 등 basic contents 부분은 일부 생략하였습니다.
--> 맨 아래 링크에 있는 영상에 모두 나와있습니다 :>)
----------------------------------------------------------------
<Convet>
(이야기에 앞서 ConvNet을 처음으로 구사한 사람은 'LeCun'이라는 분입니다.)
convolution, relu, pooling 반복하는 형태("feature extraction" part), 그 후 fully connected layer를 거침으로써 ("classification" part) 아래와 같이 이미지를 분류할 수 있습니다.

위의 과정에 대한 것을 직접 눈으로 확인해볼 수 있는 사이트입니다.
https://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html
ConvNetJS CIFAR-10 demo
cs.stanford.edu
그리고, filter를 적용한 후에 ouput size의 계산공식은 다음과 같습니다.

그리고 padding(테두리에 0으로 감싸줌)이라는 개념이 나오는데, 이것을 하는 이유는 두 가지가 있는데,
input, output size 동일하게 하기 위해 즉, 그림이 급격하게 작아지는 걸 방지하기 위함이며(일반적으로는)
또 하나는 이부분이 모서리라는 것을 네트웍에 알려주기 위함입니다.
다음은 Pooling layer에 대한 내용입니다.

filter가 적용된 conv layer 중 하나를 꺼내어 이에 대해 pooling을 적용하고(대부분 max pooling)
다시 원래 자리로 복귀하는 과정을 거칩니다.
참고로, 이 과정을 거침으로써 resize가 되므로 sampling이라고도 부릅니다.
-------------------------------------------------------
<ConvNet의 활용 예시>
*LeNet-5
*AlexNet
*GoogLeNet
*ResNet(Residual net에서 보면, 한꺼번에 껑충껑충 계산하므로 layer 수가 실제로 크더라도
학습시에는 그렇게 크지 않을 수 있음.)
*이미지뿐만 아니라 텍스트 nlp를 convnet으로 처리-->성능 괜찮음(sentence classification)
*알파고
등등 여러분야에서 좋은 성능을 발휘하였다고 합니다.
하나씩 다 구현해보면 좋은데,, 이제 딥러닝 시작하는 단계여서 그런지 보기만 해도 머리가...
우선, 이런게 있다는 정도만 알고 가겠습니다.
<Tensorflow cnn basics>
아래에 대한 정보는 앞으로 cnn을 구현할 시에 직접 넣어주어야 하는 값이므로 잘 알아두어야 합니다. :>
*image:1,3,3,1 (1개 이미지, 3*3 크기, 색 1)
*filter:2,2,1,1(2*2크기, 색1, filter 1개)--> filter개수에 따라 ouput에서 이미지 개수가 자동으로 결정된다.
*padding: SAME (filter사이즈에 상관없이 stride=1 일 때, convolution에 의해 나오는 ouput사이즈와
input사이즈와 동일하게 나오도록 패딩 적용시켜준다. 단, padding을 적용하더라도 stride=1이 아닌 2이면,
반으로 줄게 됨.)
*pooling: "데이터를 줄여 subsampling 한다."(보통 max pooling)
*ksize:kernel size <=== filter_size라고 생각하면 된다.
---------------------------------------------------------------------------
<mnist 99%의 정확도 with cnn>
이미지를 공부한다면, 많이들 공부하는 mnist에 대해 보도록 하겠습니다.
*mnist convolution layer:
참고로, 28*28 사이즈의 한 색의 이미지(이미지 형태로 넣기 위해 reshape)로 되어있습니다.
데이터 수 정해지지 않을 때 -1 또는 None을 shape부분에 넣습니다.


여기서는 Simple CNN을 적용하였는데요.
참고로, fully-connected layer(dense)부분에 넣을 이미지는 입체적인 형태를 다시 펼친 형태로
reshape시켜준 뒤의 형태입니다.
-->98%의 정확도

여기서 deep cnn을 이용해서 층을 2개에서 3개로, fc layer도 1개에서 2개로 늘려준다면
-->99%의 정확도
**tip** dropout시에 학습때는 0.5나 0.7로, 테스트시에는 반드시 1로 주의.!
-----------------------------------------------------------------
<cnn class, layers, ensemble>
python의 class라는 것을 이용한다면, 더 간단히 구현할 수 있게 됩니다.
참고로, dropout에서 training부분을 true, false 지정함으로써 테스트시에는 자동으로 rate=1로 해줍니다.
layer들을 이로써 class이용함으로써 간단히 구현할 수 있게 됩니다.
그리고, 여러 개 독립된 모델을 training시키고 new data가 들어왔을 떄, 각 모델로 prediction한 다음에
이들을 어떠한 방법으로든지 조합을 한 결과가 굉장히 좋은 성능 발휘하죠. 이것이 앙상블입니다.
-접근방법-
*deep&wide하게 접근
*CIFAR 10 데이터셋
*ImageNet
CNN 그리고, 앞으로 배울 RNN 이 두개는 실습을 통해(아래의 깃허브) 훈련을 해야 겠습니다..
이론만을 봐서는 이것을 정리하는 데도 머릿속으로 잘 그려지지 않습니다.ㅎㅎㅎ
조금 대충 적은 감이 있는데, 깃허브에선 꼼꼼히..ㅎ
모두를 위한 딥러닝 시즌1(김성훈 교수님)
https://www.youtube.com/watch?v=BS6O0zOGX4E&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm
솩코딩 깃허브
https://github.com/lala991204/DL-self-study
'DL(Deep Learning)' 카테고리의 다른 글
| Fast campus(혁펜하임) - 자기지도학습 (2) | 2023.10.09 |
|---|---|
| RNN(Recurrent Neural Network) (0) | 2022.02.01 |
| NN의 몇 가지 팁들(ReLU 사용, weight초기화, dropout과 앙상블) (0) | 2022.01.28 |
| XOR 문제 딥러닝으로 풀기/ Back Propagation (0) | 2022.01.27 |
| learning rate, overfitting, regularization (0) | 2022.01.22 |