Ordinary day

CNN Tensorflow Example 본문

Study/ML 실습 - Tensorflow

CNN Tensorflow Example

minung14 2017. 1. 3. 01:23

'모두를 위한 머신러닝' 강의(CNN 실습)의 내용을 토대로 정리한 것입니다.

출처: https://github.com/nlintz/TensorFlow-Tutorials/blob/master/05_convolutional_net.ipynb



1. 필요한 라이브러리 임포트

import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data

tf.nn.conv2d(X, w, strides=[1, 1, 1, 1], padding=’SAME’) 에서
strides의 맨 앞과 뒤는 1로 고정하고, 두번째 세번째는 옆/아래로 몇 칸씩 이동할 것인지 결정함
padding은 두가지 옵션이 있음 SAMEVALID
VALID는 패딩을 사용하지 않겠다는 것이고
SAME의 경우엔 strides가 1일 경우 원래 이미지와 같은 크기의 activation map이 나옴

ex) 입력이미지 28x28x1, 32 filters(3x3x1)이라면,
tf.nn.conv2d(X, w, strides=[1, 1, 1, 1], padding=’SAME’) 일 경우 activation map은 28x28x32가 된다.

2.ReLU 를 적용

l1a = tf.nn.relu(tf.nn.conv2d(X, w, strides=[1, 1, 1, 1], padding=’SAME’))

3.Pooling Layer (sampling)

l1 = tf.nn.max_pool(l1a, ksize=[1,2,2,1], strides=[1,2,2,1], padding=’SAME’)
이 경우, 2x2 필터 사이즈로 2칸씩 이동하게 된다. layer size는 반으로 줄어듦 -> conv layer: 28x28x32, pooling layer: 14x14x32

4. dropout 은 max_pool을 적용한 이후에 사용

l1 = tf.nn.dropout(l1, p_keep_conv) -> p_keep_conv는 training 할 때는 임의의 수로 넣어도 test할 때는 1로 넣기

l3는 결국 다차원 vector인데 이것을 하나로 펼쳐주는 함수 reshape

l3 = tf.reshape(l3, [-1, w4.get_shape().as_list()[0]])
-1: 입력 이미지 개수, w4.get_shape().as_list()[0]: 4x4x128 첫번째 값=2048

batch_size = 128
test_size = 256

def init_weights(shape):
    return tf.Variable(tf.random_normal(shape, stddev=0.01))

def model(X, w, w2, w3, w4, w_o, p_keep_conv, p_keep_hidden):
    l1a = tf.nn.relu(tf.nn.conv2d(X, w,                       # l1a shape=(?, 28, 28, 32)
                        strides=[1, 1, 1, 1], padding='SAME'))
    l1 = tf.nn.max_pool(l1a, ksize=[1, 2, 2, 1],              # l1 shape=(?, 14, 14, 32)
                        strides=[1, 2, 2, 1], padding='SAME')
    l1 = tf.nn.dropout(l1, p_keep_conv)

    l2a = tf.nn.relu(tf.nn.conv2d(l1, w2,                     # l2a shape=(?, 14, 14, 64)
                        strides=[1, 1, 1, 1], padding='SAME'))
    l2 = tf.nn.max_pool(l2a, ksize=[1, 2, 2, 1],              # l2 shape=(?, 7, 7, 64)
                        strides=[1, 2, 2, 1], padding='SAME')
    l2 = tf.nn.dropout(l2, p_keep_conv)

    l3a = tf.nn.relu(tf.nn.conv2d(l2, w3,                     # l3a shape=(?, 7, 7, 128)
                        strides=[1, 1, 1, 1], padding='SAME'))
    l3 = tf.nn.max_pool(l3a, ksize=[1, 2, 2, 1],              # l3 shape=(?, 4, 4, 128)
                        strides=[1, 2, 2, 1], padding='SAME')
    l3 = tf.reshape(l3, [-1, w4.get_shape().as_list()[0]])    # reshape to (?, 2048)
    l3 = tf.nn.dropout(l3, p_keep_conv)

    l4 = tf.nn.relu(tf.matmul(l3, w4))
    l4 = tf.nn.dropout(l4, p_keep_hidden)

    pyx = tf.matmul(l4, w_o)
    return pyx

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels
trX = trX.reshape(-1, 28, 28, 1)  # 28x28x1 input img
teX = teX.reshape(-1, 28, 28, 1)  # 28x28x1 input img
Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz

5.cost 계산, Optimization

트레이닝을 할 때 Optimizer는 다양한 것이 있으니 알아서 사용하기

ex) GradientDescentOptimizer, AdadeltaOptimizer, MomentumOptimizer, AdamOptimizer 등등


여기서 사용된 RMSPropOptimizer의 첫번째 파라미터는 learning rate, 두번째 파라미터는 decay
py_x는 예측값, Y는 실제값

X = tf.placeholder("float", [None, 28, 28, 1])
Y = tf.placeholder("float", [None, 10])

w = init_weights([3, 3, 1, 32])       # 3x3x1 conv, 32 outputs
w2 = init_weights([3, 3, 32, 64])     # 3x3x32 conv, 64 outputs
w3 = init_weights([3, 3, 64, 128])    # 3x3x32 conv, 128 outputs
w4 = init_weights([128 * 4 * 4, 625]) # FC 128 * 4 * 4 inputs, 625 outputs
w_o = init_weights([625, 10])         # FC 625 inputs, 10 outputs (labels)

p_keep_conv = tf.placeholder("float")
p_keep_hidden = tf.placeholder("float")
py_x = model(X, w, w2, w3, w4, w_o, p_keep_conv, p_keep_hidden)

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(py_x, Y))
train_op = tf.train.RMSPropOptimizer(0.001, 0.9).minimize(cost)
predict_op = tf.argmax(py_x, 1)

6.Training, Testing

배치 돌면서 트레이닝시킴, 트레이닝 할 때는 dropout 0.5~0.8로 사용
테스트 할 때는 dropout 값을 1로 사용 -> 모든 layer를 사용하도록 설정
테스트 하면서 얼마나 맞췄는지(accuracy) 출력

# Launch the graph in a session
with tf.Session() as sess:
    # you need to initialize all variables
    tf.initialize_all_variables().run()

    for i in range(100):
        training_batch = zip(range(0, len(trX), batch_size),
                             range(batch_size, len(trX)+1, batch_size))
        for start, end in training_batch:
            sess.run(train_op, feed_dict={X: trX[start:end], Y: trY[start:end],
                                          p_keep_conv: 0.8, p_keep_hidden: 0.5})

        test_indices = np.arange(len(teX)) # Get A Test Batch
        np.random.shuffle(test_indices)
        test_indices = test_indices[0:test_size]

        print(i, np.mean(np.argmax(teY[test_indices], axis=1) ==
                         sess.run(predict_op, feed_dict={X: teX[test_indices],
                                                         Y: teY[test_indices],
                                                         p_keep_conv: 1.0,
                                                         p_keep_hidden: 1.0})))


'Study > ML 실습 - Tensorflow' 카테고리의 다른 글

RNN Tensorflow Example  (0) 2017.01.08
Comments