다변수 선형 회귀(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를 이용하기
- 데이터가 많은 경우에 메모리에 한번에 올리기가 어려울 수 있기에 데이터를 조금씩 불러와 처리하는 방법
- 여러 개의 파일을 읽어와 Filename Queue에 올린다.
- Reader로 데이터를 읽는다.
- 읽은 데이터를 Decoder로 변환한다.
- 변환된 데이터를 Example Queue에 쌓는다.
- 학습을 시킬 때, 필요한(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]]점 입니다.
'모두를 위한 머신러닝' 카테고리의 다른 글
Lesson 4 연습 : Logisitc Regression Classification (0) | 2017.04.19 |
---|---|
Lesson 4 : Logistic (regression) classification (0) | 2017.04.19 |
Lesson 3 : Multi-variable Linear Regression (0) | 2017.04.16 |
Lesson 2 연습 : Linear Regression의 Hypothesis와 cost의 개념 (0) | 2017.04.11 |
Lesson 2 : Linear Regression의 Hypothesis와 cost의 개념 (0) | 2017.04.10 |