본문 바로가기
DL(Deep Learning)

CNN(Convolutional Neural Network)

by 솩코딩 2022. 2. 1.

안녕하세요. 솩코딩입니다.

오늘은 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