mnist 레이어 갯수 테스트

딥러닝에서 레이어가 많아지면 성능이 올라갈까?

말할 것도 없이 올라간다고 믿고 있고, 그렇게 수업했지만.. 어느 날 생각해 보니, 검증해 본 적이 없었다.

수업 중에 사용하던 예제를 반복문 버전으로 바꿔서 검증했다. 3, 5, 7, 9번 반복한 결과 레이어가 많아질수록 조금씩 성능 향상이 일어났다. 당연히 뒤로 갈수록 조금씩 증가하게 되고, 한계점에 도달하면 오히려 감소할 수도 있을 것이다.

테스트는 15회와 35회에 대해 2회 실시했다. 출력 결과를 보면 35회 반복에서는 9개의 레이어를 사용한 마지막 결과에서는 오히려 성능 저하가 일어났다.

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

def layerTest(mnist, layer_count, loop_count):

ww = [784, 10]
if layer_count == 2: ww = [784, 256, 10]
elif layer_count == 3: ww = [784, 512, 256, 10]
elif layer_count == 4: ww = [784, 512, 256, 128, 10]
elif layer_count == 5: ww = [784, 512, 384, 256, 128, 10]
elif layer_count == 6: ww = [784, 640, 512, 384, 256, 128, 10]
elif layer_count == 7: ww = [784, 640, 512, 384, 256, 128, 64, 10]
elif layer_count == 8: ww = [784, 640, 512, 384, 256, 128, 64, 32, 10]
elif layer_count == 9: ww = [784, 640, 512, 384, 256, 128, 64, 32, 20, 10]

bb = ww[1:]

x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)

# ----------------------------------------------- #

# mnist 기본 예제에서 3번째를 반복문 버전으로 수정한 코드.
# 굳이 반복문 안에 없어도 되기 때문에 바깥으로 뺐다.
r = x
for i in range(len(bb)):
row, col = ww[i], bb[i]

# 함수를 여러 번 호출하는 과정에서 변수 이름 충돌남. layer_count*10+i로 해결.
w = tf.get_variable(str(layer_count*10+i), shape=[row, col], initializer=tf.contrib.layers.xavier_initializer())
b = tf.Variable(tf.zeros(col))
a = tf.add(tf.matmul(r, w), b)
r = a if i == len(bb) - 1 else tf.nn.relu(a)

activation = r
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=activation, labels=y))

learning_rate = 0.01
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

sess = tf.Session()

# ----------------------------------------------- #

epoches, batch_size = 15, 100 # 15와 35 중에서 선택
for loop in range(loop_count):
# print('layer({}), loop({}) {}'.format(layer_count, loop, '-'*30))

sess.run(tf.global_variables_initializer())

for epoch in range(epoches):
avg_cost = 0
total_batch = mnist.train.num_examples // batch_size # 55,000 // 100 = 550

for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)

_, c = sess.run([optimizer, cost], feed_dict={x: batch_xs, y: batch_ys})
avg_cost += c / total_batch

# print('{:2} : {}'.format(epoch+1, avg_cost))

# -------------------------------- #

pred = tf.equal(tf.argmax(activation, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(pred, tf.float32))
acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels})

print('{} : accuracy {:.4f}, cost {:.4f}'.format(layer_count, acc, avg_cost))

sess.close()


mnist = input_data.read_data_sets('mnist', one_hot=True)

layerTest(mnist, layer_count=3, loop_count=3)
layerTest(mnist, layer_count=5, loop_count=3)
layerTest(mnist, layer_count=7, loop_count=3)
layerTest(mnist, layer_count=9, loop_count=3)
# [출력 결과 : epoches - 15]
# 3 : accuracy 0.9557, cost 0.1588
# 3 : accuracy 0.9523, cost 0.1616
# 3 : accuracy 0.9542, cost 0.1601
#
# 5 : accuracy 0.9667, cost 0.0968
# 5 : accuracy 0.9662, cost 0.0991
# 5 : accuracy 0.9656, cost 0.0982
#
# 7 : accuracy 0.9710, cost 0.0624
# 7 : accuracy 0.9715, cost 0.0632
# 7 : accuracy 0.9667, cost 0.0650
#
# 9 : accuracy 0.9702, cost 0.0404
# 9 : accuracy 0.9722, cost 0.0643
# 9 : accuracy 0.9724, cost 0.0409
# [출력 결과 : epoches - 35]
# 3 : accuracy 0.9702, cost 0.0821
# 3 : accuracy 0.9700, cost 0.0835
# 3 : accuracy 0.9710, cost 0.0826
#
# 5 : accuracy 0.9758, cost 0.0300
# 5 : accuracy 0.9773, cost 0.0290
# 5 : accuracy 0.9749, cost 0.0287
#
# 7 : accuracy 0.9673, cost 0.0635
# 7 : accuracy 0.9781, cost 0.0065
# 7 : accuracy 0.9787, cost 0.0079
#
# 9 : accuracy 0.9772, cost 0.0020
# 9 : accuracy 0.9745, cost 0.0023
# 9 : accuracy 0.9743, cost 0.0014