본문 바로가기

데이터 사이언스 공부/딥러닝

CNN, RNN

CNN:

 

주로 이미지 분석에 사용한다. filter는 이미지를 일정 크기만큼 분할하며 해당 영역의 데이터를 하나의 숫자로 만든다. 이 숫자는 WX+b 혹은 ReLU(WX+b)가 된다. 예를 들어 (25, 25, 3)의 이미지에 (5, 5, 3) filter를 적용한다면, 한 방향으로 (25 - 5) /stride + 1 만큼의 output이 나온다. stride는 filter가 겹치는 부분의 폭이다. pixel padding을 해서 이미지의 모서리 부분을 구분하기도 한다.

 

CNN은 서로 다른 weight를 갖는 filter를 여러 개 사용하여 하나의 층을 만든다. 예를 들어 첫 번째 층에서 (25, 25, 3)이 input으로 들어가고 다음 층에서 (5, 5, 3) filter를 6개 사용한다면 shape이 (20, 20, 6)인 convolution layer가 만들어진다. 그리고 같은 방법으로 다음 층에서 (5, 5, 6) filter를 10개 사용한다면 (16, 16, 10)의 convolution layer가 만들어진다.

 

conv layer를 만들면 너무 크기 때문에 max pooling을 사용하여 sub sampling을 한다. max pooling은 conv layer의 single depth slice를 filter로 사용하여 특정 영역의 가장 큰 값으로 축소시킨다. 예를 들어 (16, 16, 10)의 layer를 stride가 2인 (2, 2) filter로 max pooling 한다면 (8, 8, 10)의 layer로 sampling이 된다.

 

예제 코드:

https://github.com/hunkim/DeepLearningZeroToAll/blob/master/tf2/tf2-11-1-mnist_cnn.py

 

 

RNN:

 

순서가 있는 sequence data 분석에 사용된다. 어떤 상태 ht의 output y는 input data x와 이전 상태 ht-1을 모두 사용한다. x와 ht-1에 각각 weight를 곱하여 합한 값에 sigmoid를 해서 ht를 구한다. 그리고 ht에 또 다른 weight를 곱하여 y를 구한다.

 

실제 tensorflow 1.0 구현에서는 LSTM으로 cell을 만들고, hidden size로 output의 dimension을 정한다. 그리고 dynamic rnn에 cell과 input을 주면 output과 state를 구할 수 있다. 마지막 output을 reshape하고 fully connected나 softmax를 추가로 연결하여 결과를 얻을 수 있다. tensorflow 2.0에서는 일반 layer를 추가하는 것과 같은 방법으로 단순히 LSTM이나 GRU layer를 추가하면 된다.

 

tensorflow 1.0 RNN 예제 코드:

https://github.com/hunkim/DeepLearningZeroToAll/blob/master/tf2/tf2-12-1-hello-rnn.py

 

RNN, LSTM, GRU 비교:

https://davinci-ai.tistory.com/30

 

예제 코드에서 TimeDistributed 추가하는 이유:

https://m.blog.naver.com/PostView.nhn?blogId=chunjein&logNo=221589624838&proxyReferer=https:%2F%2Fwww.google.com%2F