2017년 11월 17일 금요일

텐서플로 시작하기(Getting Started With TensorFlow)(2)



출처 : https://www.tensorflow.org/get_started/get_started

이글은 영어 원본을 읽고 공부하면서 불필요한 내용 빼고 이해하기 쉽도록 적절히 내맘대로 작성해보았습니다. 이해가 잘못되어 원저자의 의도대로 번역이 안되어 있을 수도 있습니다. 이점 참고해서 읽어 주시면 고맙겠습니다


앞서 작성한 글


이 글은 앞서 작성한 글에 이어지는 글입니다.



모델을 학습 가능하게 만들려면 Variable를 사용하여 그래프에 학습 가능한 매개 변수를 추가 할 수 있습니다.
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b
여기에서 정리
tf.placeholder() : runtime 중에 데이터를 변경하기 위해서 사용
tf.constant() : 상수 텐서 생성
tf.Variable() : 변수 텐서 생성

tf.constant() 상수들은 tf.constant() 호출할때 초기화 되어지고, 그 값은 절대 변하지 않습니다. 반면에 tf.Variable() 변수들은 tf.Variable() 호출할때 초기화 되지않습니다. 초기화 하려면 다음과 같은 특별한 함수를 호출 해야 합니다. tf.global_variables_initializer()
init = tf.global_variables_initializer()
sess.run(init)
init(위 예제에서 init은 graph 핸들)이 모든 전역 변수를 초기화하는 TensorFlow 하위 그래프의 핸들임을 인식하는 것이 중요합니다. sess.run을 호출 할 때까지 변수는 초기화되지 않습니다.

x는 placeholder이기 때문에 몇개의 x값을 위한 linear_model을 동시에 다음과 같이 평가할 수 있습니다.
print(sess.run(linear_model, {x: [1, 2, 3, 4]}))
그러면 결과가 다음과 같이 나옵니다.
[ 0.          0.30000001  0.60000002  0.90000004]
원본에는 없지만 전체 예제는 다음과 같고 그래프도 그려보겠습니다.

전체 예제
import tensorflow as tf

sess = tf.Session()
file_writer = tf.summary.FileWriter('E:/work/ai/anaconda', sess.graph)

W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b

init = tf.global_variables_initializer()
sess.run(init)

print(sess.run(linear_model, {x: [1, 2, 3, 4]}))

file_writer.add_graph(sess.graph)
file_writer.close()




앞에서 (linear_model = W*x + b) 모델을 만들었지만 아직 얼마나 좋은지 모릅니다. 교육 데이터에 대한 모델을 평가하려면 원하는 값을 제공하기 위해 y placeholder가 필요하며 또한 손실 함수도 만들어야합니다.
손실 함수는 제공된 모델로부터 현재 모델이 얼마나 떨어져 있는지를 측정합니다. (손실함수를 오차 함수로 표현하기도합니다)
현재 모델과 제공된 데이터 사이의 델타 제곱을 합한 선형 회귀 분석에 표준 손실 모델을 사용합니다. (델타 제곱을 사용하는 이유는 오차(기준값과의 차이)가 (-)마이너스가 나온는 경우가 있기 때문에 제곱을 사용합니다. 통계에서 표준 편차나 분산 구할때 제곱을 하는 이유와 비슷합니다. )
linear_model - y 는 각 요소가 해당 예제의 오류(손실) 델타인 벡터를 만듭니다. 그리고 tf.square를 호출하여 오류를 제곱합니다. 그런 다음 모든 제곱 된 오류를 합하여 tf.reduce_sum을 사용하여 모든 예제의 오류를 추상화하는 단일 스칼라를 만듭니다.

y = tf.placeholder(tf.float32)
squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)
print(sess.run(loss, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]}))
실행하면 아래와 같은 결과가 나옵니다.
23.66
예제소스
import tensorflow as tf

sess = tf.Session()
file_writer = tf.summary.FileWriter('E:/work/ai/anaconda', sess.graph)

W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b

init = tf.global_variables_initializer()
sess.run(init)

y = tf.placeholder(tf.float32)
squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)

print(sess.run(squared_deltas, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]}))

file_writer.add_graph(sess.graph)

file_writer.close()

코드의 이해
아래 엑셀 표를 보면 23.66 이라는 값이 어떻게 나왔는지 이해하기가 쉽습니다. x, y는 각각 외부에서 정해놓은 값이 되며, W, b는 조정을 해서 y와 비교시 오차가 최소가 되도록 맞추는게 최종 목표입니다.
그런데 W:0.3, b:-0.3 의 값이 고정되어 있기 때문에 오차 제곱의 합은 23.66이 될 수 밖에 없습니다.



W와 b의 값을 -1과 1의 완벽한 값으로 재 할당하여 수동으로 향상시킬 수 있습니다. 변수는 tf.Variable 에 인자로 제공된 값으로 초기화되지만 tf.assign과 를 이용하여 변경할 수도 있습니다.

최종 결과는 오차가 0임을 보여줍니다.
0.0
W와 b의 "완벽한"값을 (수동으로)추측했지만 기계 학습의 요점은 올바른 모델 매개 변수를 자동으로 찾는 것입니다.

W:-1, b:1일때



댓글 없음:

댓글 쓰기