TensorFlow에서 stride, reshape가 의미하는 것

TensorFlow 무작정 따라하기4를 쓰다가 궁금했던 내용을 따로 쓴 글이다. Convolutional Layer를 작성하기 위해서 Convolution과 Pooling 함수를 이용하게 된다. 이 때 들어가는 파라미터 중에 stride가 있는데 stride의 각 인자가 무엇을 뜻하는지 그리고 MNIST 데이터를 받아와서 reshape를 하는데 reshape의 각 인자가 무엇을 뜻하는지를 정리했다.

StackOverflow를 참조했다.

stride = [batch, width, height, depth] 로 설정한다.

00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...
위와 같은 이미지가 있다고 했을 때, strde = [1, 1, 1, 1] 이면 필터는 아래처럼 잡힌다.
F(00 01        ->    F(01 02              -> ...
  10 11)                 11 12)

-> F(10 11  
      20 21)

width 와 height 를 1로 잡는 바람에 필터에 들어가는 내용이 겹쳐지게 되었다.
이것을 방지하기 위해서 width와 heigth를 2로 설정하면 아래처럼 된다.
즉, strde = [1, 2, 2, 1] 이면 필터는 아래처럼 잡힌다.

F(00 01        ->    F(02 03              -> ...
  10 11)                 12 13)

-> F(20 21  
      30 31)


batch를 1로 설정한 이유는 필터에 내용을 넣을 때 모든 이미지의 원소를 다 넣고싶기 때문이다. 그리고 depth를 1로 설정한 이유도 같다.

MNIST 무작정 따라하기 4에서 다음과 같은 코드가 있다.
import tensorflow as tf

x = tf.placeholder("float", shape=[None, 784])
x_image = tf.reshape(x, [-1,28,28,1])
reshape를 할 때 [-1, 28, 28, 1]은 [batch_size, width, height, channel] 을 의미한다.

batch_size를 -1로 두면 자동으로 batch_size를 조정하겠다는 뜻이다. 따라서 파이프라인을 변경해서 batch size를 변경해야하더라도 reshpae의 batch size 크기를 바꿔줄 필요가 없게된다.