Implementing CNN in Tensorflow

 

텐서플로우에서 CNN 구조를 정의하는 기초 예제를 정리해둔다.

(MNIST 데이터 셋을 사용한다고 했을 경우.)

 

(1) Placeholder 정의 :


X = tf.placeholder(tf.float32, [None, 784])

# 이미지 인풋의 shape=(?, 28, 28, 1)

X_img = tf.reshape(X, [-1, 28, 28, 1])

# 레이블의 shape=(?, 10)

Y = tf.placeholder(tf.float32, [None, 10])

 

 

(2) Filter weight 정의


# Filter들의 모든 weight값을 variable로 선언

W1 = tf.Variable(tf.random_normal([3, 3, 1, 32], stddev=0.01))

 

 

(3) 레이어 정의

 

(3-1) 인풋 텐서 / weight 텐서를 conv 레이어의 파라미터로 지정.


L1 = tf.nn.conv2d(X_img, W1, strides=[1, 1, 1, 1], padding='SAME')

# 첫번째 Convolution 이후의 shape -> (?, 28, 28, 32)

여기서 padding = ‘SAME’은 convolution 이후의 필터당 아웃풋의 이미지 사이즈가 인풋 이미지의 사이즈와 같도록 알아서 padding을 하도록 한다는 의미.

padding=’VALID’를 주면 padding을 하지 않는다. 이는 tf.pad함수를 이용해서 미리 매뉴얼하게 패딩을 해준 후에 사용한다. (https://www.tensorflow.org/api_docs/python/tf/pad)

 

(3-2) 레이어 아웃풋에 Nob-linearity 추가.


L1 = tf.nn.relu(L1)

 

(3-3) Max pooling 추가.


L1 = tf.nn.max_pool(L1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

# Max Pool 이후의 shape -> (?, 14, 14, 32)

 

Max pooling의 패딩은 조금 더 복잡하다.

Screenshot from 2017-07-03 15-01-57.png

나누어 딱 떨어지지 않는 경우 위와 같이 옵션에 따라 알아서 패딩을 해준다.

 

여기까지의 과정에 대해 생성된 텐서를 찍어보면 다음과 같다.

Tensor(“Conv2D:0”, shape=(?, 28, 28, 32), dtype=float32)

Tensor(“Relu:0”, shape=(?, 28, 28, 32), dtype=float32)

Tensor(“MaxPool:0”, shape=(?, 14, 14, 32), dtype=float32)

 

 

(4) 비슷한 과정을 반복해서 추가적인 conv layer 적용.


# 레이어 2의 인풋 이미지 shape=(?, 14, 14, 32) (레이어 1의 아웃풋 이미지 사이즈)

# 레이어 2의 conv filter들의 weight.

W2 = tf.Variable(tf.random_normal([3, 3, 32, 64], stddev=0.01))

# conv 레이어 정의

L2 = tf.nn.conv2d(L1, W2, strides=[1, 1, 1, 1], padding='SAME')

L2 = tf.nn.relu(L2)

# Conv ->(?, 14, 14, 64)

L2 = tf.nn.max_pool(L2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

# Pool ->(?, 7, 7, 64)

 

 

(5) FC layer를 붙이기 위한 flattening


L2_flat = tf.reshape(L2, [-1, 7 * 7 * 64])

 

 

(6) 마지막 FC layer (7x7x64) input -> 10 output


# FC layer의 weight들에 대한 variable 선언

W3 = tf.get_variable("W3", shape=[7 * 7 * 64, 10], initializer=tf.contrib.layers.xavier_initializer())

# FC layer의 bias들에 대한 variable 선언

b = tf.Variable(tf.random_normal([10]))

# FC layer의 연산 결과 (10개의 logit)

logits = tf.matmul(L2_flat, W3) + b

 

 

(7) Loss 및 optimizer 정의


# softmax_cross_entropy_with_logits 함수를 사용해서 loss 계산

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y))

# Adam optimizer 사용

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

 

 

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s