Learning rate와 평가 방법 연습
Training dataset과 test dataset 연습
- 우리가 가지고 있는 데이터를 그림 1과 같이 training dataset과 test dataset으로 나누어야 한다
그림 1 데이터를 학습 데이터와 테스트 데이터로 구분
- 프로그램 전체 코드
- Prediction과 Accuracy를 계산할 때 테스트 데이터셋을 사용하는 것에 주의
import tensorflow as tf x_data = [[1, 2, 1], [1, 3, 2], [1, 3, 4], [1, 5, 5], [1, 7, 5], [1, 2, 5], [1, 6, 6], [1, 7, 7]] y_data = [[0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 1, 0], [0, 1, 0], [0, 1, 0], [1, 0, 0], [1, 0, 0]] x_test = [[2, 1, 1], [3, 1, 2], [3, 3, 4]] y_test = [[0, 0, 1], [0, 0, 1], [0, 0, 1]] X = tf.placeholder(dtype='float', shape=[None, 3]) Y = tf.placeholder(dtype='float', shape=[None, 3]) W = tf.Variable(tf.random_normal([3, 3])) b = tf.Variable(tf.random_normal([3])) hypothesis = tf.nn.softmax(tf.matmul(X, W) + b) cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1)) optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost) # 모델의 성능 평가 prediction = tf.arg_max(hypothesis, 1) is_correct = tf.equal(prediction, tf.arg_max(Y, 1)) accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32)) # 텐서 그래프 실행 with tf.Session() as sess: # 텐서플로우 변수 초기화 sess.run(tf.global_variables_initializer()) for step in range(20): cost_val, W_val, _ = sess.run([cost, W, optimizer], feed_dict={X: x_data, Y: y_data}) print(f'STEP = {step:>03}, cost_val = {cost_val}, \n\tW_val = {W_val}') # 테스트 데이터로 결과값 예측하기 print(f'Prediction: {sess.run(prediction, feed_dict={X: x_test})}') # 정확도 계산하기 print(f'Accuracy: {sess.run(accuracy, feed_dict={X: x_test, Y: y_test})}')
- 테스트 데이터를 정확하게 예측하여 정확도 100%
STEP = 000, cost_val = 7.7362213134765625, W_val = [[-1.78199244 -1.11868954 0.31097311] [-0.96270818 0.571316 0.59686804] [ 0.54613751 0.99451631 0.52300102]] STEP = 001, cost_val = 4.277797222137451, W_val = [[-1.75701272 -1.09903288 0.26633674] [-0.80025268 0.65380424 0.35192436] [ 0.70857799 1.08600318 0.26907364]] STEP = 002, cost_val = 3.3367347717285156, W_val = [[-1.73212302 -1.13073337 0.27314749] [-0.63800389 0.47786415 0.36561567] [ 0.87070632 0.91418201 0.27876648]] STEP = 003, cost_val = 2.3596982955932617, W_val = [[-1.70765483 -1.13776052 0.25570655] [-0.4767729 0.41531134 0.26693752] [ 1.0309391 0.86074114 0.17197455]] STEP = 004, cost_val = 1.578892469406128, W_val = [[-1.68549311 -1.15126801 0.24705234] [-0.32190347 0.31800923 0.20937021] [ 1.18043995 0.77415037 0.10906445]] STEP = 005, cost_val = 0.9504669904708862, W_val = [[-1.67428207 -1.15372241 0.2382957 ] [-0.2109751 0.27382281 0.14262828] [ 1.27377284 0.74603862 0.04384331]] STEP = 006, cost_val = 0.7754672765731812, W_val = [[-1.68434417 -1.14607823 0.24071361] [-0.20814292 0.2871232 0.1264957 ] [ 1.25186896 0.7789281 0.03285767]] STEP = 007, cost_val = 0.7643951773643494, W_val = [[-1.68975425 -1.14531982 0.24536531] [-0.17962518 0.26310939 0.12199181] [ 1.25664175 0.77485752 0.03215552]] STEP = 008, cost_val = 0.7564760446548462, W_val = [[-1.69974136 -1.13999033 0.25002289] [-0.17699562 0.26532796 0.11714368] [ 1.23577583 0.79623437 0.03164455]] STEP = 009, cost_val = 0.7493610382080078, W_val = [[-1.7059654 -1.13871193 0.2549684 ] [-0.15456522 0.2457495 0.11429172] [ 1.23580301 0.79542232 0.03242938]] STEP = 010, cost_val = 0.742727518081665, W_val = [[-1.71523523 -1.1342057 0.25973195] [-0.14976113 0.24479081 0.11044633] [ 1.21865392 0.81247455 0.03252625]] STEP = 011, cost_val = 0.7365438938140869, W_val = [[-1.72175562 -1.13258219 0.26462874] [-0.13076863 0.22854277 0.10770187] [ 1.21668315 0.81373602 0.03323561]] STEP = 012, cost_val = 0.730728030204773, W_val = [[-1.73047745 -1.12861145 0.26937979] [-0.12475161 0.22597784 0.10424978] [ 1.20225775 0.82799172 0.03340538]] STEP = 013, cost_val = 0.7252621054649353, W_val = [[-1.73711765 -1.12680638 0.27421495] [-0.10819503 0.21210794 0.10156309] [ 1.19927382 0.83040279 0.03397828]] STEP = 014, cost_val = 0.7201066017150879, W_val = [[-1.74541831 -1.12322795 0.27893719] [-0.10161517 0.20870271 0.09838846] [ 1.1868645 0.842641 0.03414936]] STEP = 015, cost_val = 0.7152454257011414, W_val = [[-1.75208461 -1.12134075 0.28371629] [-0.08691914 0.19661304 0.09578211] [ 1.18339944 0.84564602 0.03460943]] STEP = 016, cost_val = 0.7106539011001587, W_val = [[-1.76004636 -1.11806726 0.28840458] [-0.08016367 0.19280966 0.09283005] [ 1.17255294 0.85634184 0.03476014]] STEP = 017, cost_val = 0.7063170671463013, W_val = [[-1.76668465 -1.11615694 0.29313251] [-0.06695879 0.18211773 0.09031708] [ 1.16891909 0.8596077 0.03512816]] STEP = 018, cost_val = 0.7022162079811096, W_val = [[-1.77436292 -1.11313081 0.29778466] [-0.06025715 0.17818163 0.08755152] [ 1.15933442 0.86907136 0.03524918]] STEP = 019, cost_val = 0.6983374357223511, W_val = [[-1.78094149 -1.11123252 0.3024649 ] [-0.04829093 0.16863091 0.08513602] [ 1.1557188 0.87239617 0.03553999]] Prediction: [2 2 2] Accuracy: 1.0
Learning rate 연습
- learning rate가 큰 경우에는 그림 2의 왼쪽 그림과 같이 cost 함수 값이 발산하는 경우(overshooting)가 생길 수 있음
- learning rate가 작은 경우에는 그림 2의 오른쪽 그림과 같이 cost 함수 값이 local minimum으로 수렴하지 못하게 됨
그림 2 learning rate 값이 크거나 작은 경우에 발생하는 문제점
Learning rate가 큰 경우
- 정확도가 100%인 위의 모델에서 learning rate를 15로 크게 만들면 cost 함수값이 발산하여 NaN이 됨
optimizer = tf.train.GradientDescentOptimizer(learning_rate=15).minimize(cost)
- 두번째 학습(STEP = 001)부터 cost 함수의 값이 발산하는 것을 볼 수 있다
STEP = 000, cost_val = 4.2111382484436035, W_val = [[ 1.17594206 -4.12693262 3.55341578] [ 16.24326897 -26.29383278 10.33104706] [ 16.27523804 -21.74674416 8.40264225]] STEP = 001, cost_val = nan, W_val = [[ nan nan nan] [ nan nan nan] [ nan nan nan]] STEP = 002, cost_val = nan, W_val = [[ nan nan nan] [ nan nan nan] [ nan nan nan]] STEP = 003, cost_val = nan, W_val = [[ nan nan nan] [ nan nan nan] [ nan nan nan]] STEP = 004, cost_val = nan, W_val = [[ nan nan nan] [ nan nan nan] [ nan nan nan]]
Learning rate가 작은 경우
- 정확도가 100%인 위의 모델에서 learning rate를 1e-15로 작게 만들면 cost 함수값이 거의 변화가 없어 학습이 진행되지 않게됨
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-15).minimize(cost)
- 두번째 학습(STEP = 001)부터 cost 함수의 값이 발산하는 것을 볼 수 있다
STEP = 000, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 001, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 002, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 003, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 004, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 005, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 006, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 007, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 008, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 009, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 010, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 011, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 012, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 013, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 014, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 015, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 016, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 017, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 018, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] STEP = 019, cost_val = 1.9577536582946777, W_val = [[ 1.18757093 -3.92518234 1.47391939] [-0.13499689 -0.66945004 -1.03208375] [-0.31017131 1.51171744 0.99123961]] Prediction: [2 2 2] Accuracy: 1.0
데이터 정규화 연습
- 그림 3과 같은 가상의 데이터를 다루는 경우 데이터의 분포는 그림 3의 아래처럼 된다
그림 3 데이터 값들의 차이가 큰 경우
- 데이터 값들의 차이가 큰 경우 cost 함수의 값이 발산하는 것을 볼 수 있다
그림 4 데이터 값들의 차이가 큰 경우의 예측 모델
- 그림 3의 데이터를 정규화하면 그림 4와 같은 분포를 띄게 되며 결과도 제대로 나오는 것을 알 수 있다
- 정규화를 위해 MinMaxScaler() 함수를 사용한다
그림 4 그림 3의 데이터를 정규화한 결과
'모두를 위한 머신러닝' 카테고리의 다른 글
Lesson 8 : XOR 게이트에 대한 신경망(Neural Nets) (0) | 2018.05.16 |
---|---|
Lesson 7 : Tensor Manipulation (0) | 2018.05.16 |
Lesson 6 : Application & Tips (0) | 2018.04.04 |
Lesson 5 연습 : Multinomial Classification: Softmax classification (0) | 2017.05.22 |
Lesson 5 : Multinomial Classification: Softmax classification (0) | 2017.05.19 |