본문 바로가기

Deep Learning

3. CNN

ㅁFully connected layer 의 문제점

 - 데이터의 형상이 무시된다.

 - 예를 들어 256 * 256 이미지 데이터 n개가 있다고 가정해보자. 지금까지 우리가 배운것에 의하면 이것을 행렬로 바꿔서 256*256 = 65,536 의 col 을 가지고 n개의 row 가진 Matrix 를 가질것이고 여기에 W1, W2 ... 등을 곱해서 마지막에 classification 하는 Network Layer 를 구성할 것이다. 하지만 여기에선 간과 된것이 이미지라 함은 픽셀로 부터 좌우 뿐 아니라 상하의 데이터도 관계가 있는 것인데 이를 고려하지 않은 것이다. 즉 위에서 정리한 것과 같이 데이터의 형상을 무시한것이다.


 - 그래서 CNN 레이어는 중간에는 Convolution layer 와 max pooling layer, activation layer 등으로 쌓고 마지막에 fully connected layer 를 통해 classification 하는 모습을 띈다.


 - 물론 이게 가장 basic 한 CNN Layer 의 구조이고, CNN 의 Layer 구성 방법 관련해서는 굉장히 많은 논문이 공개되어 있다.





ㅁ 합성곱 연산



 그림과 같이 노랑색 모양의 사각형( 3 * 3 ) 의 Weight 이 한칸씩 윈도우 형식으로 이동하면서 계산을 하는 것을 CNN Layer 에서의 합성곱 연산이라 한다.




ㅁ 패딩, 스트라이드

 - 위 합성곱 연산에서 문제점이 점점 데이터가 소실 된다는 것이다. 그래서 해결책으로 패딩이란것이 제시되었는데 데이터의 사이즈가 줄어들지 않도록 가장자리에 가상의 값인 0으로 채워서 합성곱 레이어를 지나도 사이즈가 줄어들지 않도록 하는 기법이다.







ㅁ 풀링

- pooling 에서 대표적으로 가장 많이 쓰이는 pooling 은 max pooling 이다.
- pooling 에는 max 풀링 뿐 아니라 min, avg 등이 있다.




ㅁ CNN in Tensorflow

...
# L1 ImgIn shape=(?, 28, 28, 1)
W1 = tf.Variable(tf.random_normal([3, 3, 1, 32], stddev=0.01))
#    Conv     -> (?, 28, 28, 32)
#    Pool     -> (?, 14, 14, 32)
L1 = tf.nn.conv2d(X_img, W1, strides=[1, 1, 1, 1], padding='SAME')
L1 = tf.nn.relu(L1)
L1 = tf.nn.max_pool(L1, ksize=[1, 2, 2, 1],
                    strides=[1, 2, 2, 1], padding='SAME')
...


conv2d

conv2d(
    input,
    filter,
    strides,
    padding,
    use_cudnn_on_gpu=None,
    data_format=None,
    name=None
)
  • input : [batch, in_height, in_width, in_channels]    
    • batch : 데이터 갯수
    • in_height : row 수
    • in_width : col 수
    • in_channels : 채널 수
  • filter : [filter_height, filter_width, in_channels, out_channels]
    • filter_height : filter row 수
    • filter_width : filter col 수
    • in_channels : filter channel 수
    • out_channels : output channels 수 
  • padding : "VAILD", "SAME" 
    • VALID : 패딩없이 하여 데이터의 사이즈가 줆.
    • SAME : 패딩을 적용하여 데이터 사이즈가 유지됌.
  •  use_cudnn_on_gpu : gpu 사용 여부 ( default : true )
  • data_format : ( default : "NHWC" ) [batch, height, width, channels]
  • name : optional ( A name for the operation )


max_pool

max_pool(
    value,
    ksize,
    strides,
    padding,
    data_format='NHWC',
    name=None
)
  • value : shape ( [batch, height, width, channels] )
  • ksize : filter size ( The size of the window for each dimension of the input tensor )
  • strides : filter sliding 을 얼칸큼씩 할건지
  • data_format : ( default : "NHWC" ) [batch, height, width, channels]
  • name : optional ( A name for the operation )


'Deep Learning' 카테고리의 다른 글

4. RNN  (0) 2017.05.30
2. 학습관련 기술들  (0) 2017.05.14
1. 오차역전파법 ( Backpropagation )  (0) 2017.05.14
0. 딥러닝 기초지식  (0) 2017.05.12