1. Tensorflow 시작
1.1 Tensorflow Install
TensorFlow를 사용하기 전에 설치부터 하자.
앞으로 나올 참고 자료들의 출처:
GPU가 있다면 GPU 버전으로 설치 or GPU가 없다면 CPU 버전으로 설치
Using CPU:
pip install tensorflow
Using GPU:
pip install Tensorflow-gpu
tensorflow-gpu 설치 이전에 CUDA, cuDNN을 설치해야만 한다.
1.2 Basic
# 텐서플로우의 기본적인 구성을 익힙니다.
import tensorflow as tf
# tf.constant: 말 그대로 상수입니다.
hello = tf.constant('Hello, TensorFlow!')
print(hello)
a = tf.constant(10)
b = tf.constant(32)
c = tf.add(a, b) # a + b 로도 쓸 수 있음
print(c)
# 위에서 변수와 수식들을 정의했지만, 실행이 정의한 시점에서 실행되는 것은 아닙니다.
# 다음처럼 Session 객제와 run 메소드를 사용할 때 계산이 됩니다.
# 따라서 모델을 구성하는 것과, 실행하는 것을 분리하여 프로그램을 깔끔하게 작성할 수 있습니다.
# 그래프를 실행할 세션을 구성합니다.
sess = tf.Session()
# sess.run: 설정한 텐서 그래프(변수나 수식 등등)를 실행합니다.
print(sess.run(hello))
print(sess.run([a, b, c]))
# 세션을 닫습니다.
sess.close()
1.3 tf.constant
상수라고 생각하면 된다.
tf.constant(
value, #값
dtype=None, #Type 지정
shape=None, #형태
name='Const’,#이름
verify_shape=False #값 형태 검증 Boolean
)
1.4 Calculate
위 예제에서는 tf.add() 함수를 사용하여 상수를 계산하였다. 앞으로 상수나 Tensor를 계산 할때는 *, /, +, - 등 연산 기호를 사용하지 말고 add, sub, mul 등 tf 함수를 사용하는 것이 좋다. GPU를 사용할 경우 tf를 통해 연산하면 GPU에서 연산이 되기 때문에 더 빠르다.
1.5 Session
위의 주석이 완벽하지만 부가 설명을 하자면 tf.Session() 세션을 여는 함수로 자주보게 될 것이다. 그리고 다른 프로그래밍 언어와 다르게 변수, 연산 등을 실행할 때는 Seesion 내에서 처리해야 한다. 그렇기 때문에 sess.run() 함수를 사용하여 원하는 변수나 연산을 실행한다.
2.1 Variable
import tensorflow as tf
# tf.placeholder: 계산을 실행할 때 입력값을 받는 변수로 사용합니다.
# None 은 크기가 정해지지 않았음을 의미합니다.
X = tf.placeholder(tf.float32, [None, 3])
print(X)
# X 플레이스홀더에 넣을 값 입니다.
# 플레이스홀더에서 설정한 것 처럼, 두번째 차원의 요소의 갯수는 3개 입니다.
x_data = [[1, 2, 3], [4, 5, 6]]
# tf.Variable: 그래프를 계산하면서 최적화 할 변수들입니다. 이 값이 바로 신경망을 좌우하는 값들입니다.
# tf.random_normal: 각 변수들의 초기값을 정규분포 랜덤 값으로 초기화합니다.
W = tf.Variable(tf.random_normal([3, 2]))
b = tf.Variable(tf.random_normal([2, 1]))
# 입력값과 변수들을 계산할 수식을 작성합니다.
# tf.matmul 처럼 mat* 로 되어 있는 함수로 행렬 계산을 수행합니다.
expr = tf.matmul(X, W) + b
sess = tf.Session()
# 위에서 설정한 Variable 들의 값들을 초기화 하기 위해
# 처음에 tf.global_variables_initializer 를 한 번 실행해야 합니다.
sess.run(tf.global_variables_initializer())
print("=== x_data ===")
print(x_data)
print("=== W ===")
print(sess.run(W))
print("=== b ===")
print(sess.run(b))
print("=== expr ===")
# expr 수식에는 X 라는 입력값이 필요합니다.
# 따라서 expr 실행시에는 이 변수에 대한 실제 입력값을 다음처럼 넣어줘야합니다.
print(sess.run(expr, feed_dict={X: x_data}))
sess.close()
2.2 tf.placeholder
보통 input과 output의 데이터를 담는데 사용한다.
placeholder(
dtype, #데이터 타입을 의미 반드시 적어야된다.
shape=None, #데이터의 형태
name=None #이름
)
2.3 tf.Variable
변수 역할을 한다.
__init__(
initial_value=None,#초기 값
trainable=True, #Optimizer할 변수 활성화
collections=None, #그래프, 기본: GraphKeys.GLOBAL_VARIABLES
validate_shape=True,#True 인 경우 initial_value의 모양을 알아야함
caching_device=None, #None이 아니면 다른 장치에 캐시한다
name=None, #이름
variable_def=None, #protocol buffer
dtype=None,# 설정될 경우 initial_value가 지정된 유형으로 변환
expected_shape=None, #TensorShape
import_scope=None, #프로토콜 버퍼에서 초기화 할 때만 사용
constraint=None, #변수 값을 나타내는 투영되지 않은 Tensor를 입력
use_resource=None, #리소스 변수 사용 여부
synchronization=tf.VariableSynchronization.AUTO,
aggregation=tf.VariableAggregation.NONE
)
2.4 tf.random_normal
tf.random.normal(
shape, #형태
mean=0.0, #정규 분포의 평균
stddev=1.0, #정규 분포의 표준 편차
dtype=tf.dtypes.float32,#type
seed=None, #배포용 임의 시드
name=None #이름
)
σ: 표준편차 μ: 평균
3.1 Linear Regression
X 와 Y 의 상관관계를 분석하는 기초적인 선형 회귀 모델을 만들고 실행해봅니다.
import tensorflow as tf
x_data = [1, 2, 3]
y_data = [1, 2, 3]
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
# name: 나중에 텐서보드등으로 값의 변화를 추적하거나 살펴보기 쉽게 하기 위해 이름을 붙여줍니다.
X = tf.placeholder(tf.float32, name="X")
Y = tf.placeholder(tf.float32, name="Y")
print(X)
print(Y)
# X 와 Y 의 상관 관계를 분석하기 위한 가설 수식을 작성합니다.
# y = W * x + b
# W 와 X 가 행렬이 아니므로 tf.matmul 이 아니라 기본 곱셈 기호를 사용했습니다.
hypothesis = W * X + b
# 손실 함수를 작성합니다.
# mean(h - Y)^2 : 예측값과 실제값의 거리를 비용(손실) 함수로 정합니다.
cost = tf.reduce_mean(tf.square(hypothesis - Y))
# 텐서플로우에 기본적으로 포함되어 있는 함수를 이용해 경사 하강법 최적화를 수행합니다.
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
# 비용을 최소화 하는 것이 최종 목표
train_op = optimizer.minimize(cost)
# 세션을 생성하고 초기화합니다.
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
# 최적화를 100번 수행합니다.
for step in range(100):
# sess.run 을 통해 train_op 와 cost 그래프를 계산합니다.
# 이 때, 가설 수식에 넣어야 할 실제값을 feed_dict 을 통해 전달합니다.
_, cost_val = sess.run([train_op, cost], feed_dict={X: x_data, Y: y_data})
print(step, cost_val, sess.run(W), sess.run(b))
# 최적화가 완료된 모델에 테스트 값을 넣고 결과가 잘 나오는지 확인해봅니다.
print("\n=== Test ===")
print("X: 5, Y:", sess.run(hypothesis, feed_dict={X: 5}))
print("X: 2.5, Y:", sess.run(hypothesis, feed_dict={X: 2.5}))
3.2 tf.random_uniform
tf.random.uniform(
shape, # 형태
minval=0, #최소값
maxval=None,#최대값
dtype=tf.dtypes.float32, #Type
seed=None, #배포용 임의 시드
name=None #이름
)
3.3 Linear regression
Regression을 학습을 할 때 가설을 세울 필요가 있으며 가설을 세우는 것이 Linear Regression이다. Linear하게 가설을 세운다는 것은 데이터가 있다면 데이터에 알맞은 Linear한 선을 찾는 것이다. 그리고 이 선을 찾는 과정이 학습을 하는 것이다.
3.4 Cost Function
모델을 학습시키기 위해서는 일반적으로 다음 과정을 거친다.
- Cost Function을 정의
- Gradient Descent 알고리즘을 이용해서 파라미터를 업데이트한다.
Cost Function으로 널리 쓰이는 형태 중 하나는 MSE(Mean Squared Error)이다. 예측값(prediction), 실제 타겟 값(True target value) 차이를 제곱해서 모두 더한 값들의 평균으로 정의한다.
위 수식을 코드로 변환하면
hypothesis = W * X + b
cost = tf.reduce_mean(tf.square(hypothesis - Y))
우리가 구한 hypothesis 값과 정답인 Y의 오차범위를 구하는 과정이다. square(제곱)을 하는 이유는 점 사이의 거리가 음수가 나올 수도 있기 때문이다.
3.5 Gradient descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op = optimizer.minimize(cost)
weight에 따라 cost 값을 뿌려보면 다음과 같은 형태를 하고 있다.(다를 수도 있다.) 이 때 전부 값을 비교해서 가장 cost가 작은 값을 찾으면 되는데 이 과정에서 매우 많은 비교를 필요로 하기 때문에 비효율 적이다.
그러면, 어떻게 쉽고 빠르게 가장 작은 cost를 찾을 수 있을까?
바로 미분을 사요하는 것이다. 미분은 기울기를 구하는 것인데 기울기가 적은 곳으로 점점 내려가면 cost가 낮은 쪽으로 이동할 수 있다.
미분을 좀 더 쉽게 하기 위해서 m -> 2m 으로 바꾼다.
의미 변화는 없다.
‘:=‘ 수식은 오른쪽의 값을 왼쪽에 적용시킨다는 것이다.