다변수 선형 회귀(Multi-variable Linear Regression) 연습

변수가 3개인 아래의 표를 텐서플로우로 구현하기

  • 아래의 표에 대하여 가설식은 다음과 같이 쓸 수 있다.

\begin{equation} H(x_1, x_2, x_3) = x_1\times w_1 + x_2\times w_2 + x_3 \times x_3 + b\tag{1}\end{equation}

  • 가설식과 훈련용 데이터는 텐서플로우를 사용하여 다음과 같이 구현한다.

    • 변수가 1개일 때 구현했던 코드의 방식으로 구현
# 훈련용 데이터 입력
x1_data = [ 73.,  93.,  89.,  96.,  73.]
x2_data = [ 80.,  88.,  91.,  98.,  66.]
x3_data = [ 75.,  93.,  90., 100.,  70.]
y_data  = [152., 185., 180., 196., 142.]

# plaeceholder를 사용하여 텐서 자료를 입력
x1 = tf.placeholder(tf.float32)
x2 = tf.placeholder(tf.float32)
x3 = tf.placeholder(tf.float32)

Y = tf.placeholder(tf.float32)

# weight와 bias는 난수를 발생하여 조정을 하는 값이기에 변수로 설정하며, 모양(shape)은 1차원 벡터
w1 = tf.Variable(tf.random_normal([1]), name='weight1')
w2 = tf.Variable(tf.random_normal([1]), name='weight2')
w3 = tf.Variable(tf.random_normal([1]), name='weight3')
b = tf.Variable(tf.random_normal([1]), name='bias')

# 가설식은 식(1)과 같이 입력
hypothesis = x1*w1 + x2*w2 + x3*w3 + b


  • 텐서플로우 그래프로 구현을 위한 전체 코드
import tensorflow as tf

# 훈련용 데이터 입력
x1_data = [ 73.,  93.,  89.,  96.,  73.]
x2_data = [ 80.,  88.,  91.,  98.,  66.]
x3_data = [ 75.,  93.,  90., 100.,  70.]
y_data  = [152., 185., 180., 196., 142.]

# plaeceholder를 사용하여 텐서 자료를 입력
x1 = tf.placeholder(tf.float32)
x2 = tf.placeholder(tf.float32)
x3 = tf.placeholder(tf.float32)

Y = tf.placeholder(tf.float32)

# weight와 bias는 난수를 발생하여 조정을 하는 값이기에 변수로 설정하고, 모양(shape)은 1차원 벡터
w1 = tf.Variable(tf.random_normal([1]), name='weight1')
w2 = tf.Variable(tf.random_normal([1]), name='weight2')
w3 = tf.Variable(tf.random_normal([1]), name='weight3')
b = tf.Variable(tf.random_normal([1]), name='bias')

# 가설식을 세운다.
hypothesis = x1*w1 + x2*w2 + x3*w3 + b

# cost(loss) 함수
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# 데이터에 대하여 cost 함수의 극소값을 구하기 위하여 경사 하강법 최적화 메서드를 사용
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)

# cost 함수에 대하여 경사 하강법으로 극소값 구하기
train = optimizer.minimize(cost)

# 세션에서 그래프 만들기
sess = tf.Session()

# 변수 초기화
sess.run(tf.global_variables_initializer())

# 학습은 2000번을 시킴
for step in range(2001):
    
#sess.run() 메서드로 그래프를 실행하고 placeholder를 위해 feed_dict으로 데이터 입력
    cost_val, hy_val, _ = sess.run([cost, hypothesis, train],
                                   feed_dict={x1: x1_data, x2: x2_data, x3: x3_data, Y: y_data})

# 10번마다 출력
    if step % 10 == 0:
        print(f"STEP = {step:04}, cost = {cost_val:>2.2}, 예측값 = {hy_val}")


  • 실행 결과 1: 실행할 때마다 2000번 학습 후의 cost(loss) 함수 극소값이 변한다.
STEP = 0000, cost = 1.7e+05, 예측값 = [-220.54341125 -247.40852356 -252.95663452 -274.93395996 -184.68412781]
STEP = 0100, cost = 2.9e+01, 예측값 = [ 143.69319153  189.97506714  178.21386719  194.57540894  148.8497467 ]
STEP = 0200, cost = 2.8e+01, 예측값 = [ 143.90032959  189.83311462  178.27740479  194.62081909  148.66397095]
STEP = 0300, cost = 2.6e+01, 예측값 = [ 144.10192871  189.69499207  178.33926392  194.66497803  148.48318481]
STEP = 0400, cost = 2.5e+01, 예측값 = [ 144.29812622  189.56054688  178.39944458  194.70794678  148.30722046]
STEP = 0500, cost = 2.4e+01, 예측값 = [ 144.48912048  189.42965698  178.45803833  194.74975586  148.13598633]
STEP = 0600, cost = 2.2e+01, 예측값 = [ 144.67500305  189.30229187  178.51507568  194.79043579  147.96931458]
STEP = 0700, cost = 2.1e+01, 예측값 = [ 144.855896    189.17831421  178.57055664  194.82998657  147.80711365]
STEP = 0800, cost = 2e+01, 예측값 = [ 145.03199768  189.05767822  178.62460327  194.86851501  147.64927673]
STEP = 0900, cost = 1.9e+01, 예측값 = [ 145.2033844   188.94024658  178.67718506  194.90597534  147.4956665 ]
STEP = 1000, cost = 1.8e+01, 예측값 = [ 145.37019348  188.82594299  178.7283783   194.94242859  147.34616089]
STEP = 1100, cost = 1.7e+01, 예측값 = [ 145.532547    188.71469116  178.77818298  194.97789001  147.20066833]
STEP = 1200, cost = 1.6e+01, 예측값 = [ 145.69056702  188.60643005  178.82667542  195.01239014  147.05905151]
STEP = 1300, cost = 1.5e+01, 예측값 = [ 145.84437561  188.50105286  178.87388611  195.04597473  146.92124939]
STEP = 1400, cost = 1.5e+01, 예측값 = [ 145.99407959  188.39846802  178.91981506  195.07861328  146.78713989]
STEP = 1500, cost = 1.4e+01, 예측값 = [ 146.13977051  188.29864502  178.96453857  195.1104126   146.65663147]
STEP = 1600, cost = 1.3e+01, 예측값 = [ 146.28160095  188.20149231  179.00805664  195.14131165  146.52960205]
STEP = 1700, cost = 1.2e+01, 예측값 = [ 146.4196167   188.10691833  179.0504303   195.17140198  146.4059906 ]
STEP = 1800, cost = 1.2e+01, 예측값 = [ 146.55397034  188.01487732  179.09165955  195.20066833  146.28567505]
STEP = 1900, cost = 1.1e+01, 예측값 = [ 146.68473816  187.92527771  179.13179016  195.22911072  146.16860962]
STEP = 2000, cost = 1.1e+01, 예측값 = [ 146.81201172  187.83810425  179.17086792  195.25683594  146.05465698]


  • 실행 결과 2
STEP = 0000, cost = 1.1e+05, 예측값 = [-136.4148407  -163.72163391 -161.54948425 -175.06773376 -125.43991089]
STEP = 0100, cost = 2.2, 예측값 = [ 152.6002655   183.7406311   180.76570129  197.70622253  139.60707092]
STEP = 0200, cost = 2.2, 예측값 = [ 152.55526733  183.77182007  180.75238037  197.69287109  139.65115356]
STEP = 0300, cost = 2.1, 예측값 = [ 152.51152039  183.80220032  180.73945618  197.67982483  139.69410706]
STEP = 0400, cost = 2.0, 예측값 = [ 152.46899414  183.83172607  180.72689819  197.66705322  139.73597717]
STEP = 0500, cost = 1.9, 예측값 = [ 152.42764282  183.86042786  180.71470642  197.65457153  139.77677917]
STEP = 0600, cost = 1.9, 예측값 = [ 152.38745117  183.88838196  180.7028656   197.64233398  139.81652832]
STEP = 0700, cost = 1.8, 예측값 = [ 152.34835815  183.9155426   180.69134521  197.63034058  139.85525513]
STEP = 0800, cost = 1.7, 예측값 = [ 152.31034851  183.94197083  180.68016052  197.61860657  139.89302063]
STEP = 0900, cost = 1.7, 예측값 = [ 152.27339172  183.96765137  180.66931152  197.6071167   139.92982483]
STEP = 1000, cost = 1.6, 예측값 = [ 152.23748779  183.99264526  180.65878296  197.59585571  139.96568298]
STEP = 1100, cost = 1.6, 예측값 = [ 152.20256042  184.01695251  180.64852905  197.58483887  140.00062561]
STEP = 1200, cost = 1.5, 예측값 = [ 152.16860962  184.04057312  180.63859558  197.57402039  140.03469849]
STEP = 1300, cost = 1.5, 예측값 = [ 152.13563538  184.06358337  180.62895203  197.56344604  140.06791687]
STEP = 1400, cost = 1.5, 예측값 = [ 152.1035614   184.08592224  180.61958313  197.55307007  140.1002655 ]
STEP = 1500, cost = 1.4, 예측값 = [ 152.07237244  184.10765076  180.61048889  197.54292297  140.13182068]
STEP = 1600, cost = 1.4, 예측값 = [ 152.04206848  184.12879944  180.60166931  197.53294373  140.16259766]
STEP = 1700, cost = 1.3, 예측값 = [ 152.01261902  184.14935303  180.59310913  197.52319336  140.19258118]
STEP = 1800, cost = 1.3, 예측값 = [ 151.98400879  184.16934204  180.58480835  197.5136261   140.22181702]
STEP = 1900, cost = 1.3, 예측값 = [ 151.95617676  184.18875122  180.57672119  197.50421143  140.25030518]
STEP = 2000, cost = 1.2, 예측값 = [ 151.92913818  184.2076416   180.56889343  197.49502563  140.27810669]


  • 실행 결과 3
STEP = 0000, cost = 3.9e+04, 예측값 = [-18.12299919 -29.6329422  -25.06500816 -28.79134178 -23.24040413]
STEP = 0100, cost = 1.3e+01, 예측값 = [ 156.88265991  180.98231506  182.31651306  197.05860901  137.4597168 ]
STEP = 0200, cost = 1.3e+01, 예측값 = [ 156.74263     181.07827759  182.27355957  197.02807617  137.58518982]
STEP = 0300, cost = 1.2e+01, 예측값 = [ 156.60632324  181.17166138  182.23170471  196.99833679  137.70729065]
STEP = 0400, cost = 1.1e+01, 예측값 = [ 156.47367859  181.26254272  182.19100952  196.96942139  137.8261261 ]
STEP = 0500, cost = 1.1e+01, 예측값 = [ 156.34454346  181.35101318  182.15135193  196.94128418  137.94177246]
STEP = 0600, cost = 1e+01, 예측값 = [ 156.21887207  181.43711853  182.11277771  196.91392517  138.05430603]
STEP = 0700, cost = 9.7, 예측값 = [ 156.09654236  181.5209198   182.07521057  196.88728333  138.16383362]
STEP = 0800, cost = 9.2, 예측값 = [ 155.97747803  181.60247803  182.03865051  196.86135864  138.27043152]
STEP = 0900, cost = 8.8, 예측값 = [ 155.86161804  181.68186951  182.00309753  196.8361969   138.37416077]
STEP = 1000, cost = 8.3, 예측값 = [ 155.74882507  181.75914001  181.96846008  196.81164551  138.47512817]
STEP = 1100, cost = 7.9, 예측값 = [ 155.63903809  181.83433533  181.93473816  196.78781128  138.57337952]
STEP = 1200, cost = 7.5, 예측값 = [ 155.53219604  181.907547    181.90193176  196.7645874   138.66897583]
STEP = 1300, cost = 7.1, 예측값 = [ 155.42819214  181.97877502  181.87001038  196.74201965  138.76203918]
STEP = 1400, cost = 6.7, 예측값 = [ 155.32696533  182.04811096  181.83891296  196.72007751  138.85258484]
STEP = 1500, cost = 6.4, 예측값 = [ 155.22842407  182.11561584  181.80865479  196.69869995  138.9407196 ]
STEP = 1600, cost = 6.0, 예측값 = [ 155.13253784  182.18130493  181.77920532  196.67791748  139.026474  ]
STEP = 1700, cost = 5.7, 예측값 = [ 155.03919983  182.24523926  181.75053406  196.6577301   139.10993958]
STEP = 1800, cost = 5.4, 예측값 = [ 154.94836426  182.3074646   181.72262573  196.63806152  139.19116211]
STEP = 1900, cost = 5.2, 예측값 = [ 154.85992432  182.36802673  181.69544983  196.61891174  139.27020264]
STEP = 2000, cost = 4.9, 예측값 = [ 154.77386475  182.42698669  181.66902161  196.60032654  139.34713745]


변수가 3개 데이터를 행렬식을 이용하여 텐서플로우로 구현하기

  • 위의 식 (1)을 행렬식으로 표현하면 다음과 같이 쓸 수 있다.

\begin{eqnarray}(x_1, x_2, x_3) \cdot \left(\begin{array}{c} w_1\\ w_2\\ w_3\end{array}\right) + b = (x_1 w_1 + x_2 w_2 + x_3 w_3 + b)\tag{2}\end{eqnarray}

$$H(\mathbf{X}) = \mathbf{X}\cdot\mathbf{W} + b$$

  • 식 (2)를 코드로 구현하면 다음과 같다.
    • 행렬식을 이용하면 데이터 선언부의 코드가 간결해진다.
import tensorflow as tf

# 인스턴스 데이터
x_data = [[73., 80., 75.], [93., 88., 93.], [89., 91., 90.],
          [96., 98., 100.], [73., 66., 70]]
y_data = [[152.], [185.], [180.], [196.], [142.]]

# placeholder를 사용하여 텐서 자료를 입력
# 예에서 X의 차원은 5x3이지만 인스턴스의 갯수는 얼마인지 모르기 때문에 None으로 설정
# 에어서 Y의 차원은 5x1이지만 인스턴스의 갯수는 얼마인지 모르기 때문에 None으로 설정
X = tf.placeholder(tf.float32, shape=[None, 3])
Y = tf.placeholder(tf.float32, shape=[None, 1])

# weight와 bias는 난수를 발생하여 조정을 하는 값이기에 변수로 설정하고, 모양(shape)은 1차원 벡터
W = tf.Variable(tf.random_normal([3, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')

# 가설식은 다음과 같이 구현
hypothesis = tf.matmul(X, W) + b

# cost(loss) 함수
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# cost 함수의 극소값을 경사 하강법으로 계산
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)
train = optimizer.minimize(cost)

# 세션에서 그래프 만들기
sess = tf.Session()
sess.run(tf.global_variables_initializer())

for step in range(20001):
    cost_val, hy_val, _ = sess.run([cost, hypothesis, train],
                                    feed_dict={X: x_data, Y: y_data})
    if step % 5000 == 0:
        print(f"STEP = {step:06}, cost = {cost_val:>2.2}, \n\t예측값 = {hy_val}")
  • 실행 결과

STEP = 000000, cost = 1.3e+05, 
	예측값 = [[-165.87182617]
 [-201.77796936]
 [-197.4772644 ]
 [-213.77851868]
 [-155.99333191]]
STEP = 005000, cost = 1.8, 
	예측값 = [[ 151.40869141]
 [ 184.49110413]
 [ 180.5823822 ]
 [ 197.92095947]
 [ 139.85758972]]
STEP = 010000, cost = 1.2, 
	예측값 = [[ 150.81903076]
 [ 184.91998291]
 [ 180.43295288]
 [ 197.56921387]
 [ 140.62631226]]
STEP = 015000, cost = 0.96, 
	예측값 = [[ 150.73706055]
 [ 184.99801636]
 [ 180.43545532]
 [ 197.35534668]
 [ 140.91104126]]
STEP = 020000, cost = 0.8, 
	예측값 = [[ 150.77804565]
 [ 184.98928833]
 [ 180.47247314]
 [ 197.19113159]
 [ 141.06103516]]



파일에서 데이터를 불러와 학습시키기

  • .csv 파일로 저장된 데이터를 읽기 위해서 numpy 모듈의 loadtxt() 메서드를 사용

import numpy as np
import tensorflow as tf
tf.set_random_seed(777) # 난수발생의 초기값을 주면 실행할 때마다 같은 결과가 나온다.

# 텍스트 파일 불러오기
xy = np.loadtxt('data-01-test-score.csv', delimiter=',', dtype=np.float32)

# 모든 데이터 행과 처음부터 마지막 -1개의 열까지 선택
x_data = xy[:, 0:-1]
# 마지막 열만 선택
y_data = xy[:, [-1]]

# 데이터가 정상적으로 들어왔는지 확인
print(x_data.shape, x_data, len(x_data))
print(y_data.shape, y_data)

# 학습을 위한 데이터는 실행 시 입
X = tf.placeholder(tf.float32, shape=[None, 3])
Y = tf.placeholder(tf.float32, shape=[None, 1])

W = tf.Variable(tf.random_normal([3, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')

# 가설식
hypothesis = tf.matmul(X, W) + b

# cost(loss) 함수
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# 경사 하강법
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)
train = optimizer.minimize(cost)

sess = tf.Session()

# 변수 초기화
sess.run(tf.global_variables_initializer())

for step in range(2001):
    cost_val, hy_val, _ = sess.run([cost, hypothesis, train], feed_dict={X: x_data, Y: y_data})

    if step % 100 == 0:
        print(f"STEP = {step:06}, cost = {cost_val:>2.2}, 예측값 = {hy_val}")

print(f"예상 점수는 {sess.run(hypothesis, feed_dict={X: [[100, 70, 101]]})}점입니다.")
print(f"예상 점수는 {sess.run(hypothesis, feed_dict={X: [[60, 70, 110], [90, 100, 80]]})}입니다.")


  • 실행 결과

STEP = 000000, cost = 2.1e+04, 예측값 = [[ 22.04806328]
 [ 21.61978722]
 [ 24.09669304]
 [ 22.29300499]
 [ 18.6339016 ]
 [  7.2669735 ]
 [ 12.33102989]
 [  3.15051103]
 [ 14.34794426]
 [  4.25342369]
 [ 14.48570824]
 [ 10.67806816]
 [ 28.80463982]
 [ 29.29880333]
 [ 11.23783684]
 [ 18.6465435 ]
 [ 31.18945122]
 [ 13.34466362]
 [ 28.84174156]
 [ 25.66280937]
 [ 15.08476067]
 [ 16.79836845]
 [ 15.92455101]
 [ 31.36112022]
 [ 24.98636436]]
STEP = 000100, cost = 8.9e+01, 예측값 = [[ 157.79551697]
 [ 185.16719055]
 [ 185.02406311]
 [ 197.75952148]
 [ 143.29411316]
 [  99.53504944]
 [ 143.86805725]
 [ 100.9239502 ]
 [ 167.53520203]
 [ 146.62893677]
 [ 141.12159729]
 [ 135.79484558]
 [ 194.86228943]
 [ 167.07516479]
 [ 143.46055603]
 [ 184.7673645 ]
 [ 162.27658081]
 [ 171.24031067]
 [ 187.06117249]
 [ 167.22627258]
 [ 169.31620789]
 [ 170.40232849]
 [ 162.88063049]
 [ 167.75440979]
 [ 194.32646179]]
STEP = 000200, cost = 8.2e+01, 예측값 = [[ 157.52545166]
 [ 185.21311951]
 [ 184.86227417]
 [ 197.77949524]
 [ 143.25938416]
 [  99.85552216]
 [ 144.07087708]
 [ 101.32597351]
 [ 167.90383911]
 [ 147.4372406 ]
 [ 141.22596741]
 [ 136.13650513]
 [ 194.50056458]
 [ 166.51863098]
 [ 143.74137878]
 [ 184.96679688]
 [ 161.62319946]
 [ 171.52180481]
 [ 186.62805176]
 [ 166.83427429]
 [ 169.53741455]
 [ 170.61328125]
 [ 163.00415039]
 [ 167.02830505]
 [ 194.22337341]]
STEP = 000300, cost = 7.6e+01, 예측값 = [[ 157.26860046]
 [ 185.25523376]
 [ 184.70755005]
 [ 197.79917908]
 [ 143.22341919]
 [ 100.16048431]
 [ 144.26712036]
 [ 101.71485138]
 [ 168.25456238]
 [ 148.20953369]
 [ 141.3263092 ]
 [ 136.46244812]
 [ 194.15400696]
 [ 165.98475647]
 [ 144.01177979]
 [ 185.15658569]
 [ 160.99502563]
 [ 171.79490662]
 [ 186.21368408]
 [ 166.4597168 ]
 [ 169.75090027]
 [ 170.81416321]
 [ 163.12428284]
 [ 166.33384705]
 [ 194.12316895]]
STEP = 000400, cost = 7.1e+01, 예측값 = [[ 157.02441406]
 [ 185.29376221]
 [ 184.55958557]
 [ 197.818573  ]
 [ 143.18641663]
 [ 100.45061493]
 [ 144.45703125]
 [ 102.09101868]
 [ 168.58824158]
 [ 148.94743347]
 [ 141.4228363 ]
 [ 136.77339172]
 [ 193.82192993]
 [ 165.47264099]
 [ 144.2721405 ]
 [ 185.33714294]
 [ 160.39103699]
 [ 172.05995178]
 [ 185.81723022]
 [ 166.10186768]
 [ 169.95700073]
 [ 171.00540161]
 [ 163.24116516]
 [ 165.66970825]
 [ 194.02583313]]
STEP = 000500, cost = 6.6e+01, 예측값 = [[ 156.79225159]
 [ 185.3289032 ]
 [ 184.41809082]
 [ 197.837677  ]
 [ 143.14839172]
 [ 100.72661591]
 [ 144.64083862]
 [ 102.45493317]
 [ 168.90560913]
 [ 149.65238953]
 [ 141.51565552]
 [ 137.06997681]
 [ 193.50372314]
 [ 164.9813385 ]
 [ 144.52288818]
 [ 185.50892639]
 [ 159.81025696]
 [ 172.31713867]
 [ 185.4379425 ]
 [ 165.75994873]
 [ 170.15597534]
 [ 171.18740845]
 [ 163.35482788]
 [ 165.03453064]
 [ 193.93121338]]
STEP = 000600, cost = 6.1e+01, 예측값 = [[ 156.57159424]
 [ 185.36087036]
 [ 184.28277588]
 [ 197.85649109]
 [ 143.10952759]
 [ 100.989151  ]
 [ 144.81872559]
 [ 102.80702209]
 [ 169.2074585 ]
 [ 150.32595825]
 [ 141.60496521]
 [ 137.35290527]
 [ 193.19885254]
 [ 164.51004028]
 [ 144.76437378]
 [ 185.67233276]
 [ 159.2517395 ]
 [ 172.56677246]
 [ 185.07507324]
 [ 165.43330383]
 [ 170.3480835 ]
 [ 171.36068726]
 [ 163.46540833]
 [ 164.42706299]
 [ 193.83927917]]
STEP = 000700, cost = 5.7e+01, 예측값 = [[ 156.36187744]
 [ 185.38980103]
 [ 184.15339661]
 [ 197.87501526]
 [ 143.06987   ]
 [ 101.23881531]
 [ 144.99092102]
 [ 103.14772034]
 [ 169.49452209]
 [ 150.96943665]
 [ 141.69085693]
 [ 137.62275696]
 [ 192.90667725]
 [ 164.05786133]
 [ 144.99700928]
 [ 185.82775879]
 [ 158.71463013]
 [ 172.80905151]
 [ 184.72793579]
 [ 165.12123108]
 [ 170.53359985]
 [ 171.52554321]
 [ 163.57298279]
 [ 163.84609985]
 [ 193.74992371]]
STEP = 000800, cost = 5.3e+01, 예측값 = [[ 156.16262817]
 [ 185.4158783 ]
 [ 184.0296936 ]
 [ 197.89324951]
 [ 143.02955627]
 [ 101.47621155]
 [ 145.15762329]
 [ 103.47737885]
 [ 169.76745605]
 [ 151.584198  ]
 [ 141.77349854]
 [ 137.88009644]
 [ 192.62672424]
 [ 163.6240387 ]
 [ 145.22106934]
 [ 185.97554016]
 [ 158.19802856]
 [ 173.04420471]
 [ 184.39579773]
 [ 164.82312012]
 [ 170.7127533 ]
 [ 171.68243408]
 [ 163.67765808]
 [ 163.29051208]
 [ 193.66308594]]
STEP = 000900, cost = 5e+01, 예측값 = [[ 155.97331238]
 [ 185.43925476]
 [ 183.91137695]
 [ 197.91117859]
 [ 142.98864746]
 [ 101.70191956]
 [ 145.31900024]
 [ 103.79642487]
 [ 170.0269165 ]
 [ 152.17144775]
 [ 141.85299683]
 [ 138.12550354]
 [ 192.3584137 ]
 [ 163.20774841]
 [ 145.43692017]
 [ 186.11605835]
 [ 157.7011261 ]
 [ 173.2724762 ]
 [ 184.07800293]
 [ 164.53826904]
 [ 170.88574219]
 [ 171.83169556]
 [ 163.77944946]
 [ 162.75912476]
 [ 193.57867432]]
STEP = 001000, cost = 4.6e+01, 예측값 = [[ 155.79348755]
 [ 185.46012878]
 [ 183.79823303]
 [ 197.92881775]
 [ 142.94723511]
 [ 101.91647339]
 [ 145.47525024]
 [ 104.10523224]
 [ 170.27351379]
 [ 152.73246765]
 [ 141.92948914]
 [ 138.35954285]
 [ 192.1013031 ]
 [ 162.80830383]
 [ 145.64486694]
 [ 186.24963379]
 [ 157.22314453]
 [ 173.49409485]
 [ 183.77397156]
 [ 164.26617432]
 [ 171.05285645]
 [ 171.97366333]
 [ 163.87850952]
 [ 162.25094604]
 [ 193.49662781]]
STEP = 001100, cost = 4.3e+01, 예측값 = [[ 155.62272644]
 [ 185.47862244]
 [ 183.69007874]
 [ 197.94621277]
 [ 142.90541077]
 [ 102.1204071 ]
 [ 145.62657166]
 [ 104.40414429]
 [ 170.50788879]
 [ 153.26844788]
 [ 142.00312805]
 [ 138.5827179 ]
 [ 191.85491943]
 [ 162.42503357]
 [ 145.84529114]
 [ 186.37664795]
 [ 156.76332092]
 [ 173.70927429]
 [ 183.48313904]
 [ 164.00630188]
 [ 171.21430969]
 [ 172.10874939]
 [ 163.97494507]
 [ 161.76498413]
 [ 193.41691589]]
STEP = 001200, cost = 4e+01, 예측값 = [[ 155.46055603]
 [ 185.49481201]
 [ 183.58660889]
 [ 197.96324158]
 [ 142.8631897 ]
 [ 102.31417084]
 [ 145.77307129]
 [ 104.69348145]
 [ 170.7305603 ]
 [ 153.78036499]
 [ 142.07395935]
 [ 138.79547119]
 [ 191.6187439 ]
 [ 162.05717468]
 [ 146.0383606 ]
 [ 186.49729919]
 [ 156.32089233]
 [ 173.91812134]
 [ 183.20481873]
 [ 163.75796509]
 [ 171.37023926]
 [ 172.23716736]
 [ 164.06867981]
 [ 161.3001709 ]
 [ 193.33934021]]
STEP = 001300, cost = 3.8e+01, 예측값 = [[ 155.30664062]
 [ 185.50897217]
 [ 183.48768616]
 [ 197.9800415 ]
 [ 142.82073975]
 [ 102.49828339]
 [ 145.91497803]
 [ 104.97361755]
 [ 170.94210815]
 [ 154.26937866]
 [ 142.14213562]
 [ 138.99832153]
 [ 191.39239502]
 [ 161.7041626 ]
 [ 146.22445679]
 [ 186.61195374]
 [ 155.8952179 ]
 [ 174.12097168]
 [ 182.9385376 ]
 [ 163.52081299]
 [ 171.52090454]
 [ 172.35928345]
 [ 164.15995789]
 [ 160.85568237]
 [ 193.26399231]]
STEP = 001400, cost = 3.6e+01, 예측값 = [[ 155.16055298]
 [ 185.52110291]
 [ 183.39309692]
 [ 197.99653625]
 [ 142.77804565]
 [ 102.67317963]
 [ 146.0524292 ]
 [ 105.2448349 ]
 [ 171.14305115]
 [ 154.73649597]
 [ 142.20776367]
 [ 139.19171143]
 [ 191.17546082]
 [ 161.3653717 ]
 [ 146.40379333]
 [ 186.72090149]
 [ 155.48564148]
 [ 174.31794739]
 [ 182.68380737]
 [ 163.29426575]
 [ 171.66648865]
 [ 172.47540283]
 [ 164.24874878]
 [ 160.43058777]
 [ 193.19070435]]
STEP = 001500, cost = 3.3e+01, 예측값 = [[ 155.02191162]
 [ 185.53137207]
 [ 183.30264282]
 [ 198.01274109]
 [ 142.73519897]
 [ 102.8392868 ]
 [ 146.18556213]
 [ 105.50745392]
 [ 171.3338623 ]
 [ 155.18266296]
 [ 142.27093506]
 [ 139.37605286]
 [ 190.96749878]
 [ 161.04016113]
 [ 146.5766449 ]
 [ 186.82435608]
 [ 155.09146118]
 [ 174.50920105]
 [ 182.44006348]
 [ 163.0778656 ]
 [ 171.80715942]
 [ 172.58575439]
 [ 164.3351593 ]
 [ 160.02403259]
 [ 193.11946106]]
STEP = 001600, cost = 3.1e+01, 예측값 = [[ 154.89038086]
 [ 185.53990173]
 [ 183.21614075]
 [ 198.02865601]
 [ 142.69224548]
 [ 102.99702454]
 [ 146.31452942]
 [ 105.76177216]
 [ 171.51502991]
 [ 155.60881042]
 [ 142.33174133]
 [ 139.55175781]
 [ 190.76817322]
 [ 160.72802734]
 [ 146.74327087]
 [ 186.92260742]
 [ 154.71209717]
 [ 174.69496155]
 [ 182.2068634 ]
 [ 162.8711853 ]
 [ 171.94313049]
 [ 172.69062805]
 [ 164.41925049]
 [ 159.63523865]
 [ 193.05018616]]
STEP = 001700, cost = 2.9e+01, 예측값 = [[ 154.76565552]
 [ 185.54676819]
 [ 183.13346863]
 [ 198.04428101]
 [ 142.64924622]
 [ 103.14676666]
 [ 146.43946838]
 [ 106.00806427]
 [ 171.68702698]
 [ 156.01580811]
 [ 142.39027405]
 [ 139.71922302]
 [ 190.57711792]
 [ 160.4283905 ]
 [ 146.90393066]
 [ 187.01591492]
 [ 154.34698486]
 [ 174.87536621]
 [ 181.98373413]
 [ 162.67378235]
 [ 172.07453918]
 [ 172.79029846]
 [ 164.50109863]
 [ 159.26341248]
 [ 192.98280334]]
STEP = 001800, cost = 2.8e+01, 예측값 = [[ 154.64735413]
 [ 185.55213928]
 [ 183.05438232]
 [ 198.05966187]
 [ 142.60624695]
 [ 103.28892517]
 [ 146.56053162]
 [ 106.24662018]
 [ 171.8502655 ]
 [ 156.40454102]
 [ 142.44665527]
 [ 139.87882996]
 [ 190.39398193]
 [ 160.14077759]
 [ 147.05882263]
 [ 187.10449219]
 [ 153.99554443]
 [ 175.0506134 ]
 [ 181.77027893]
 [ 162.48524475]
 [ 172.20155334]
 [ 172.88504028]
 [ 164.58074951]
 [ 158.90783691]
 [ 192.91732788]]
STEP = 001900, cost = 2.6e+01, 예측값 = [[ 154.53521729]
 [ 185.55604553]
 [ 182.97874451]
 [ 198.07472229]
 [ 142.56329346]
 [ 103.42381287]
 [ 146.67782593]
 [ 106.47769165]
 [ 172.00514221]
 [ 156.77580261]
 [ 142.50093079]
 [ 140.03089905]
 [ 190.21838379]
 [ 159.86463928]
 [ 147.2081604 ]
 [ 187.1885376 ]
 [ 153.65722656]
 [ 175.2208252 ]
 [ 181.56602478]
 [ 162.30516052]
 [ 172.32432556]
 [ 172.97499084]
 [ 164.65826416]
 [ 158.56776428]
 [ 192.85362244]]
STEP = 002000, cost = 2.5e+01, 예측값 = [[ 154.42892456]
 [ 185.55859375]
 [ 182.90646362]
 [ 198.08952332]
 [ 142.52043152]
 [ 103.55178833]
 [ 146.79150391]
 [ 106.70152283]
 [ 172.15206909]
 [ 157.13037109]
 [ 142.55319214]
 [ 140.17581177]
 [ 190.05004883]
 [ 159.59951782]
 [ 147.35217285]
 [ 187.26829529]
 [ 153.33151245]
 [ 175.38618469]
 [ 181.37059021]
 [ 162.13319397]
 [ 172.4430542 ]
 [ 173.06040955]
 [ 164.73371887]
 [ 158.24256897]
 [ 192.79165649]]
예상 점수는 [[ 181.73277283]]점입니다.
예상 점수는 [[ 145.86265564]
 [ 187.23129272]]입니다.




데이터가 많은 경우 Queue Runners를 이용하기

  • 데이터가 많은 경우에 메모리에 한번에 올리기가 어려울 수 있기에 데이터를 조금씩 불러와 처리하는 방법
  1. 여러 개의 파일을 읽어와 Filename Queue에 올린다.
  2. Reader로 데이터를 읽는다.
  3. 읽은 데이터를 Decoder로 변환한다.
  4. 변환된 데이터를 Example Queue에 쌓는다.
  5. 학습을 시킬 때, 필요한(batch) 만큼만 불러와 학습을 시킨다.
  • 전체 과정을 TensorFlow가 알아서 관리를 해준다.

  • 위의 그림을 수행하는 코드

import tensorflow as tf
tf.set_random_seed(777) # 실행할 때마다 같은 값이 나오도록 난수 발생의 초기값 설정

# 파일을 불러와 queue에 올리기
filename_queue = tf.train.string_input_producer(
    ['data-01-test-score.csv'], shuffle=False, name='filename_queue')

# reader로 데이터 읽기
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)

# csv 데이터를 디코딩해서 queue에 올려놓기
record_defaults = [[0.], [0.], [0.], [0.]]
xy = tf.decode_csv(value, record_defaults=record_defaults)

# queue에서 일정부분(batch)씩 데이터 가져오기
train_x_batch, train_y_batch = tf.train.batch([xy[0:-1], xy[-1:]], batch_size=10)

X = tf.placeholder(tf.float32, shape=[None, 3])
Y = tf.placeholder(tf.float32, shape=[None, 1])

W = tf.Variable(tf.random_normal([3, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')


# 가설식
hypothesis = tf.matmul(X, W) + b

# cost(loss) 함수
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# 경사 하강법으로 학습
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)
train = optimizer.minimize(cost)

# 세션에서 그래프 생성
sess = tf.Session()
# 그래프의 모든 변수 초기화
sess.run(tf.global_variables_initializer())

# filename queue 동작시키기
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)

for step in range(2001):
    x_batch, y_batch = sess.run([train_x_batch, train_y_batch])
    cost_val, hy_val, _ = sess.run([cost, hypothesis, train],
                                   feed_dict={X: x_batch, Y: y_batch})

    if step % 100 == 0:
        print(f"STEP = {step:06}, cost = {cost_val:>02.2}, 예측값 = {hy_val}")

coord.request_stop()
coord.join(threads)


# 점수 에측을 해보자.
# 예상 점수는 185.34점
print(f"예상 점수는 {sess.run(hypothesis, feed_dict={X: [[100, 70, 101]]})}점 입니다.")
# 예상 점수는 [178.36, 17.04]점
print(f"다른 점수를 예상해보면 {sess.run(hypothesis, feed_dict={X: [[60, 70, 110], [90, 100, 80]]})}점 입니다.")

coord.request_stop()
coord.join(threads)


  • 실행 결과

STEP = 000000, cost = 7.1e+03, 예측값 = [[ 235.2278595 ]
 [ 282.40145874]
 [ 278.3961792 ]
 [ 303.915802  ]
 [ 214.6239624 ]
 [ 159.15426636]
 [ 228.53509521]
 [ 170.92645264]
 [ 264.6505127 ]
 [ 246.59117126]]
STEP = 000100, cost = 4.6, 예측값 = [[ 154.07789612]
 [ 184.91040039]
 [ 182.31237793]
 [ 199.29498291]
 [ 140.26403809]
 [ 104.37033844]
 [ 150.24282837]
 [ 112.91205597]
 [ 173.57489014]
 [ 162.28497314]]
STEP = 000200, cost = 4.5, 예측값 = [[ 154.04267883]
 [ 184.92453003]
 [ 182.29525757]
 [ 199.30024719]
 [ 140.26908875]
 [ 104.4174881 ]
 [ 150.26643372]
 [ 112.95542145]
 [ 173.63035583]
 [ 162.39421082]]
STEP = 000300, cost = 4.5, 예측값 = [[ 154.00915527]
 [ 184.93783569]
 [ 182.27888489]
 [ 199.30531311]
 [ 140.27363586]
 [ 104.46237946]
 [ 150.28919983]
 [ 112.9972229 ]
 [ 173.68315125]
 [ 162.49847412]]
STEP = 000400, cost = 4.4, 예측값 = [[ 153.97727966]
 [ 184.95040894]
 [ 182.26325989]
 [ 199.31021118]
 [ 140.27775574]
 [ 104.50511169]
 [ 150.31112671]
 [ 113.03752899]
 [ 173.73344421]
 [ 162.5980072 ]]
STEP = 000500, cost = 4.4, 예측값 = [[ 153.94692993]
 [ 184.96224976]
 [ 182.24832153]
 [ 199.31491089]
 [ 140.28144836]
 [ 104.54580688]
 [ 150.33224487]
 [ 113.07639313]
 [ 173.78132629]
 [ 162.69300842]]
STEP = 000600, cost = 4.4, 예측값 = [[ 153.91807556]
 [ 184.97341919]
 [ 182.23405457]
 [ 199.31947327]
 [ 140.28475952]
 [ 104.58454895]
 [ 150.35263062]
 [ 113.11388397]
 [ 173.82691956]
 [ 162.78370667]]
STEP = 000700, cost = 4.3, 예측값 = [[ 153.89060974]
 [ 184.9839325 ]
 [ 182.22041321]
 [ 199.3238678 ]
 [ 140.28768921]
 [ 104.62140656]
 [ 150.37226868]
 [ 113.15003204]
 [ 173.87030029]
 [ 162.87026978]]
STEP = 000800, cost = 4.3, 예측값 = [[ 153.86450195]
 [ 184.99382019]
 [ 182.20739746]
 [ 199.32810974]
 [ 140.29025269]
 [ 104.65649414]
 [ 150.39120483]
 [ 113.18490601]
 [ 173.91160583]
 [ 162.95289612]]
STEP = 000900, cost = 4.3, 예측값 = [[ 153.83964539]
 [ 185.00311279]
 [ 182.19496155]
 [ 199.33216858]
 [ 140.29249573]
 [ 104.68988037]
 [ 150.4094696 ]
 [ 113.21853638]
 [ 173.95091248]
 [ 163.03175354]]
STEP = 001000, cost = 4.3, 예측값 = [[ 153.81602478]
 [ 185.0118866 ]
 [ 182.18305969]
 [ 199.33612061]
 [ 140.29444885]
 [ 104.7216568 ]
 [ 150.42707825]
 [ 113.25099945]
 [ 173.98832703]
 [ 163.10702515]]
STEP = 001100, cost = 4.3, 예측값 = [[ 153.79354858]
 [ 185.02008057]
 [ 182.17169189]
 [ 199.33990479]
 [ 140.29608154]
 [ 104.75189972]
 [ 150.44403076]
 [ 113.28232574]
 [ 174.02389526]
 [ 163.17886353]]
STEP = 001200, cost = 4.3, 예측값 = [[ 153.7722168 ]
 [ 185.02780151]
 [ 182.16082764]
 [ 199.34359741]
 [ 140.29745483]
 [ 104.78065491]
 [ 150.4604187 ]
 [ 113.31253052]
 [ 174.05776978]
 [ 163.24742126]]
STEP = 001300, cost = 4.3, 예측값 = [[ 153.75189209]
 [ 185.03504944]
 [ 182.15046692]
 [ 199.34712219]
 [ 140.29856873]
 [ 104.80802155]
 [ 150.47621155]
 [ 113.34170532]
 [ 174.08998108]
 [ 163.31285095]]
STEP = 001400, cost = 4.2, 예측값 = [[ 153.73258972]
 [ 185.04185486]
 [ 182.14054871]
 [ 199.35054016]
 [ 140.29945374]
 [ 104.83404541]
 [ 150.49145508]
 [ 113.36985016]
 [ 174.12062073]
 [ 163.37532043]]
STEP = 001500, cost = 4.2, 예측값 = [[ 153.71424866]
 [ 185.04821777]
 [ 182.131073  ]
 [ 199.35385132]
 [ 140.30010986]
 [ 104.85879517]
 [ 150.50616455]
 [ 113.39702606]
 [ 174.14978027]
 [ 163.43490601]]
STEP = 001600, cost = 4.2, 예측값 = [[ 153.69680786]
 [ 185.05418396]
 [ 182.12202454]
 [ 199.35704041]
 [ 140.30055237]
 [ 104.88233948]
 [ 150.52033997]
 [ 113.42326355]
 [ 174.17750549]
 [ 163.49179077]]
STEP = 001700, cost = 4.2, 예측값 = [[ 153.68023682]
 [ 185.05975342]
 [ 182.1133728 ]
 [ 199.36010742]
 [ 140.30078125]
 [ 104.90473175]
 [ 150.5340271 ]
 [ 113.44860077]
 [ 174.20388794]
 [ 163.54608154]]
STEP = 001800, cost = 4.2, 예측값 = [[ 153.664505  ]
 [ 185.06495667]
 [ 182.10508728]
 [ 199.36308289]
 [ 140.30085754]
 [ 104.9260025 ]
 [ 150.54724121]
 [ 113.47304535]
 [ 174.22892761]
 [ 163.59788513]]
STEP = 001900, cost = 4.2, 예측값 = [[ 153.64956665]
 [ 185.06985474]
 [ 182.09719849]
 [ 199.36595154]
 [ 140.30075073]
 [ 104.94623566]
 [ 150.55999756]
 [ 113.49666595]
 [ 174.2527771 ]
 [ 163.64732361]]
STEP = 002000, cost = 4.2, 예측값 = [[ 153.63536072]
 [ 185.0743866 ]
 [ 182.08964539]
 [ 199.36869812]
 [ 140.30047607]
 [ 104.96544647]
 [ 150.5723114 ]
 [ 113.51947784]
 [ 174.27540588]
 [ 163.69447327]]
예상 점수는 [[ 185.33529663]]점 입니다.
다른 점수를 예상해보면 [[ 178.36242676]
 [ 177.03689575]]점 입니다.


+ Recent posts