관리 메뉴

ComputerVision Jack

[골빈해커 Chapter6 정리] 본문

DeepLearning/골빈해커 - Tensor Lib

[골빈해커 Chapter6 정리]

JackYoon 2020. 1. 16. 16:43
반응형

[개념 정리]

06_헬로 딥러닝 MNIST.ipynb
0.02MB

Mnist 데이터를 이용한 신경망 학습

우선 데이터를 분석한다. mnist의 데이터는 28 * 28 사이즈의 이미지로 되어있다.

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

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

#우리는 이미지를 통으로 집어 넣기 때문에 feature 사이즈는 28 * 28 = 784이다.

그리고 label은 (0 ~ 9) 까지 이기 때문에 10으로 설정한다.

 

미니 배치 : 데이터를 적당한 크기로 잘라서 학습시키는 것

배치 사이즈를 설정하고 데이터가 한바퀴 다 돌아야 1epochs 라고 한다.

 

W1 = tf.Variable(tf.random_normal([784, 256], stddev = 0.01))

L1 = tf.nn.relu(tf.matmul(X, W1))

 

W2 = tf.Variable(tf.random_normal([256, 256], stddev = 0.01))

L2 = tf.nn.relu(tf.matmul(L1, W2))

 

W3 = tf.Variable(tf.random_normal([256, 10], stddev = 0.01))

model = tf.matmul(L2, W3)

#신경망 층을 만들어 준다. 일반적으로 은닉층은 입력 shape보단 작은게 좋다.

 

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

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

# cost함수 설정한다 logits_v2로 바뀐것을 명심히자.

최적화는 Adam을 사용하였다.

 

DropOut(드롭 아웃)

과적합을 해결 하는 방법

학습시 신경망의 일부만 사용하도록 하고 ( 가중치의 균형을 잡아준다.)

예측에서 신경망의 전체를 이용하는 원리.

 

W1 = tf.Variable(tf.random_normal([784, 256], stddev = 0.01))

L1 = tf.nn.relu(tf.matmul(X, W1))

L1 = tf.nn.dropout(L1, 0.8)

#신경망의 뒷부분에 dropout을 설정한다.

L1 층에 대해 80%만 활성화 시킨다는 것을 의미한다.

대부분 keep_prob이라는 변수를 이용하여 placeholder를 생성하고 feed_dict으로 던져준다.

 

최근 추세

배치 정규화

tf.layers.batch_normalization(L1, training = is_training)

과적합을 막아줄 뿐아니라 학습 속도도 향상시켜 준다.

 

마지막으로 matplotlib 라이브러리를 사용하여 결과를 출력해본다.

[코드 분석]

batch_xs, batch_ys = mnist.train.next_batch(batch_size)

    _, cost_val = sess.run([optimizer, cost], feed_dict = {X: batch_xs, Y: batch_ys})

# batch_size를 설정해 주면 알아서 데이터를 읽어온다.

 

is_correct = tf.equal(tf.argmax(model, 1), tf.argmax(Y, 1))

# tf.argmax() 를 통하여 내모델에서 가장 크게 차지하는 값을 뽑아 본다.

[ 0.2, 0.3, 0.4, 0.2, 0.3, 0.5, 0.1, 0.2, 0.3, 0.4]

식일 경우 argmax()를 통하여 [0, 0, 0, 0, 0, 1, 0, 0, 0, 0] 식으로 만들어낸다.

그리고 실제 라벨과 같은 지 판별한다.

 

keep_prob = tf.placeholder(tf.float32)

#위 형식으로 dropout 설정할 변수를 placeholder로 생성

(0 ~ 1 사이의 값으로 설정한다)

 

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)

# dropout을 설정한다.

 

 _, cost_val = sess.run([optimizer, cost],

                           feed_dict = {X: batch_xs, Y: batch_ys, keep_prob: 0.8})

#feed_dict을 통하여 값을 던저준다.

학습때는 80%의 노드만 활성화 시키겠다.

 

print('정확도 : ',sess.run(accuracy, feed_dict = {X: mnist.test.images, Y: mnist.test.labels, keep_prob: 1}))

#이제 실제의 결과를 예측할 때 모든 노드를 활성화 시켜서 확인한다.

반응형

'DeepLearning > 골빈해커 - Tensor Lib' 카테고리의 다른 글

[골빈해커 Chapter8 정리]  (0) 2020.01.19
[골빈해커 Chapter7정리]  (0) 2020.01.17
[골빈해커 Chapter5 정리]  (0) 2020.01.15
[골빈해커 Chapter4 정리]  (0) 2020.01.14
[골빈해커 Chapter3 정리]  (0) 2020.01.13
Comments