[Tensorflow] Overfitting 해결방법

2021. 5. 3. 03:22 AI, 머신러닝/TensorFlow.js

네트워크를 구성하고, training을 하는데, accuracy와 cross-entropy의 그래프에서 training, validation의 값이 차이가 나는게 보였다. 빨간색이 training, 파란색이 validation이다. training의 acc의 값은 증가하고, cross-entropy의 값은 계속 줄어드는데 반면, validation의 값은 반대로 유지가 되거나, 반대로 증감하는 그래프를 확인할 수 있었다. 즉 현재 네트워크는 overfitting 되었다고 말할 수 있다.

 

 

 

 

Dropout

 

tensorflow에서는 fully connected layer를 일정 노드를 dropout을 함으로써,

overfitting문제를 해결한다. 

 

input으로는 neuron’s을 유지할 probability를 입력해주면 간단하게 구현이 가능하다. 

모든 구현은 tf.nn.dropout op가 자동적으로 scaling neuron ouptuts을 해준다.

 

keep_proba = tf.placeholder(tf.float32)

h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

 

Readout Layer

 

softmax regression 바로 위의 layer인 readout layer에 추가를 하면된다. 

 

W_fc2 = weight_variable([1024, 10])

b_fc2 = bias_variable([10])

 

y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2

 

Train and Evaluate the model

 

run()할때, feed_dict에 keep_prob을 추가하면 된다.  

 

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_conv, y_))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
sess.run(tf.global_variables_initializer())
for i in range(20000):
  batch = mnist.train.next_batch(50)
  if i%100 == 0:
    train_accuracy = accuracy.eval(feed_dict={
        x:batch[0], y_: batch[1], keep_prob: 1.0})
    print("step %d, training accuracy %g"%(i, train_accuracy))
  train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

print("test accuracy %g"%accuracy.eval(feed_dict={
    x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

 

[참고]

https://www.tensorflow.org/tutorials/mnist/pros/

 

출처 : ourcstory.tistory.com/232?category=680621