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의 데이터를 정규화한 결과


+ Recent posts