텐서플로우 - Linear regression 코드 정리
- 파이썬을 거의 모르는 사람도, 코드를 이해 가능할만큼, 함수와 기타 등등이 뭔지 정리함.
- 내가 강의할때 보거나 할것.
* 텐서플로우가 어떻게 돌아가는지에 대한 이해는 있어야함!
모르면 머신러닝 포스팅 lab 1&2 보기
import tensorflow as tf
'텐서플로우' 라는 패키지를 불러와서, 그 이름을 "tf" 라고 하자.
* as tf 안하면 tensorflow 관련 함수 호출할때 tensorflow.~~~ 해야되는데,
as tf 하면 tf.~~~하면 됨, 아주 간편함!
x_train = [1, 2, 3, 4]
y_train = [0,-1,-2,-3]
x,y값을 일단 선언해둠. (데이터를 이걸로 할거라 미리 저장해 놓는 것)
# Placeholder 설정
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
# 변수 설정
W = tf.Variable(tf.random_normal([1]))
b = tf.Variable(tf.random_normal([1]))
tf.Placeholder 뜻 : 지금 미리 값을 넣어두는 것이 아니고, 나중에 sess.run 할때 데이터를 집어넣을 것임.
뭔소린지 모르겠다면 머신러닝 포스팅 lab 1&2로 가서 확인할 것.
tf.Variable 뜻 : 텐서플로우의 변수선언.
tf.random_normal([1])) 뜻 : [1] 크기의 랜덤한 (정규분포를 따르는) 수를 생성함.
Linear regression 코드이므로, W,b값이 각각 하나이기 때문에 [1] 씩만 생성함.
hypothesis = X * W + b
Linear regression 의 Hypothesis function H(x) = W*x + b 를 hypothesis로 선언함.
cost = tf.reduce_mean(tf.square(hypothesis - Y))
Cost function이었던
$$(H(x) - y)^2 을 각각의 데이터 m개에 대하여 모두 더하고, m으로 나누어 평균을 구함.$$
을 구현한 것.
tf.square 뜻 : 제곱.
tf.reduce_mean 뜻 : 평균.
* hypothesis 는 x*W + b이고, x 는 크기 4의 배열이라 계산된 총 크기는 [4],
y도 [4] 이므로 둘이 빼면 그냥 다 더한거랑 똑같은 게 됨.
train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)
Gradient Descent 방법을 이용하여 train함.
minimize(cost) : cost를 최소화 시킬것임.
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for step in range(1001):
sess.run(train, feed_dict={X: x_train, Y: y_train})
if step%50 == 0:
W_val, b_val, cost_val = sess.run([W, b, cost], feed_dict={X: x_train, Y: y_train})
print(" < Step : %d>" %step)
print("Cost : ",cost_val,"\nW :",W_val,"\nb : ",b_val,"\n\n")
# evaluate training accuracy
print(f"W: {W_val} b: {b_val} cost: {cost_val}")
session을 열음.
sess.run(tf.global_variables_initializer()) 뜻 : 아직 초기화되지 않은 (값이 박히지도 않은) 변수들을 죄다 초기화해줌.
이거 안하면 변수 터짐.
for step in range(1001) : 뜻 - 0부터 1000까지 돌릴것 ㅎ
sess.run(train, feed_dict = {X: x_train, Y: y_train}) 뜻 : train 함수를 실행시킴 (minimize(cost) 한것)
cost에는 tf.square(Hypothesis - Y) 가 있으니 Y값이 필요할 것이고,
Hypothesis 에는 X*W + b가 있으므로 X값이 필요함.
그 두개의 X,Y를 아까 선언해뒀던 x_train, y_train값으로 집어넣음.
if step%50 == 0: - step이 50의 배수일때 (50,100,150,200 ... , 1000번째 step에서 : )
W_val, b_val, cost_val = sess.run([W, b, cost], feed_dict={X: x_train, Y: y_train}) 뜻 :
W_val, b_val, cost_val 에 각각 W,b,cost의 값을 집어넣음.
cost의 값에는 위에서 언급했듯이 X,Y 둘다 있으므로, feed_dict 로 X,Y값으로 넣어줌.
아래는 간단한 print이므로 설명 생략.
끝~