본문 바로가기
python/tensorflow

[TensorFlow] 인공지능 : MNIST / 심층신경망 / dropOut

by 래끼 2022. 2. 16.
728x90
반응형

 

작년에 학교에서 전공으로 인공지능 수업 들었을때 했던 과제인데

필요한 분들 있으실까봐 공유합니다!

 

 

 

문제

1. 데이터는 MNIST를 사용한다.

2. 심층신경망의 입력층, 은닉층 3개(첫번째, 두번째, 세번째 은닉층 노드 개수 각각 256개, 256개, 256개), 출력층으로 되어 있는 모델을 생성하고 그밖의 사항들은 자유롭게 지정한다.

3. 최적화 방법은 Gradient Descent Optimization 을 사용한다.

4. 과적합 방지를 위해 droupout의 수치를 변경하면서 성능을 분석한다.

 

 


 

1. tensorflow 라이브러리 import 후 버전 확인

# tensorflow 버전 확인
import tensorflow as tf
print(tf.__version__)

 

 

2. 버전을 1.15로 낮춘다

# 2.x 버전일 경우 현재 tensorflow 제거
!pip uninstall tensorflow

# 1.15 버전으로 tensorflow 설치
!pip install tensorflow==1.15

# 설치 후 안내창에 'You must restart the runtime in order to use newly installed versions.'라는 문구가 출력될 경우 상단 메뉴바 런타임-런타임 다시 시작 클릭

 

 

3. numpy 라이브러리 추가, matplotlib 추가 , 데이터로 mnist 사용

import tensorflow as tf
import numpy as np                # 추가
import matplotlib.pyplot as plt   # 추가

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./mnist/data", one_hot=True)

 

 

4. 과적합 방지를 위해 drop out을 수행한다. 

# 신경망 모델 구성

X = tf.placeholder(tf.float32, [None, 784])
Y = tf.placeholder(tf.float32, [None, 10])
keep_prob = tf.placeholder(tf.float32) # 추가

W1 = tf.Variable(tf.random_normal([784,256],stddev=0.01))
L1 = tf.nn.relu(tf.matmul(X, W1))
L1 = tf.nn.dropout(L1, keep_prob) 

W2 = tf.Variable(tf.random_normal([256,256], stddev=0.01))
L2 = tf.nn.relu(tf.matmul(L1, W2))
L2 = tf.nn.dropout(L2, keep_prob) 

W3 = tf.Variable(tf.random_normal([256,256], stddev=0.01))
L3 = tf.nn.relu(tf.matmul(L2, W3))
L3 = tf.nn.dropout(L3, keep_prob) 

W4 = tf.Variable(tf.random_normal([256,10], stddev=0.01))
model = tf.matmul(L3, W4)

입력층 , 은닉층 3개 (노드 수 첫번째 256개 , 두번째 256개 , 세번째 256개) , 출력층으로 하였다. Drop out을 수행하였다.

 

 

5. 최적화 방법으로 Gradient Descent Optimization을 사용

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

optimizer = tf.train.GradientDescentOptimizer(0.1).minimize(cost)

 

 

6. 신경망 모델을 학습한다.

# 신경망 모델 학습

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

batch_size = 100
total_batch = int(mnist.train.num_examples / batch_size)

for epoch in range(15):
  total_cost = 0

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

    # 학습 코드 - dropout rate: 0.8 추가
    _, cost_val = sess.run([optimizer, cost], feed_dict={X: batch_xs, 
                                                         Y: batch_ys, 
                                                         keep_prob: 0.8}) 
    total_cost += cost_val
  
  print('Epoch:', '%04d' % (epoch + 1), 'Avg. cost = ', '{:.3f}'.
        format(total_cost / total_batch))

print('최적화 완료!')

Epoch를 반복하면서 cost가 0에 가까워지는 것을 확인할 수 있었다.

 

 

7. 결과 확인

# 결과 확인

is_correct = tf.equal(tf.argmax(model, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
# 예측 코드 - dropout rate: 1 추가
print('정확도: ', sess.run(accuracy, feed_dict={X: mnist.test.images, 
                                             Y: mnist.test.labels, 
                                             keep_prob: 1}))

최종적으로 정확도가 0.9767이 되었다

 

 

8. 결과를 matplotlib 확인

# 결과 확인 (matplotlib) - 추가

labels = sess.run(model, feed_dict={X: mnist.test.images, Y: mnist.test.labels,
                                    keep_prob: 1})

fig = plt.figure()
for i in range(10):
  subplot = fig.add_subplot(2, 5, i + 1)
  subplot.set_xticks([])
  subplot.set_yticks([])
  subplot.set_title('%d' % np.argmax(labels[i]))
  subplot.imshow(mnist.test.images[i].reshape(28, 28), cmap=plt.cm.gray_r)
plt.show()

 

728x90
반응형

댓글