본문 바로가기

정보공유/개발&코딩

TensorFlow 기본 사용법 III (간단한 학습)









TensorFlow 기본 사용법 III


간단한 학습으로 X행렬 구하기





  "TensorFlow 기본 사용법 II (행렬 곱하기)"에서 행렬 곱셈을 실습해 보았고 이것이 왜 필요한지에 대해 대략적으로 소개했습니다. 잠깐 지난 강좌의 예시를 살펴보겠습니다.


물체 A : 2m, 1kg           물체 B : 1m, 1kg           A와 B를 구분하는 행렬 찾기


물체 A = [2, 1]

물체 B = [1, 1]


X = [[1, -1],

         [-1, 2]]


1이 맞는 것 0이 아닌 것이라고 가정하면 아래와 같이 곱하기로 어떤 물체인지 행렬임을 알 수 있습니다.



A * X = [ 1, 0 ]

B * X = [ 0, 1 ]




이것을 뉴럴넷의 모양으로 나타내면 아래와 같습니다.



  왼쪽의 동그라미 두 개는 A, B의 입력값에 해당하고 화살표들은 이를 구분하는 2X2 행렬의 계수들 그리고 우측 동그라미 두 개는 결과 값에 해당합니다.



1. 입력값과 출력값




2. 파라미터를 위한 공간할당

tf.placeholder가 하는 역할은 계산을 하는데 필요한 공간 또는 구하는 값이 들어갈 자리를 할당해 주는 것 입니다. 우선 입력값은 "높이"와 "무게" 두 가지가 있기 때문에 열은 두 개를 지정해줍니다. 그리고 행의 숫자를 None으로 지정할 수 있는데, 학습하려는 데이터의 갯수가 정확하지 않거나 수 만개가 넘는 경우가 많기 때문에 None으로 입력하실 수 있도록 기능이 만들어진 것 입니다. 결과도 마찬가지로 A또는 B두가지 이기 때문에 [None, 2]로 할당을 해줍니다.


다음으로 지금 저희가 찾고 있는 X를 위한 공간을 할당해주고 그 안에 임의의 숫자를 입력해 줍니다. tf.truncated_normal은 0을 평균으로 정규분포하는 임의의 숫자를 할당해 줍니다.


가장 우측에 있는 name은 말그대로 해당 공간에 이름을 붙여주는 것입니다. 이것을 붙이지 않는다고 프로그램이 돌아가는데 문제가 되지는 않지만, 나중에는 학습한 파라미터들을 저장해서 사용해야 하기 때문에 연습할 때부터 이름을 붙여주겠습니다.



3. 계산을 위한 cost와 변수 할당

각 입력값과 결과값이 순서대로 매칭이 되도록 x와 y_에 맵핑을 해줍니다. 그리고 지난 시간에 배운 행렬 곱셈을 이용해서 입력값 x에 구하는 행렬 X를 곱한 값을 y라고 지정해줍니다.


그러면 이 곱한 값과 알고 있는 결과값이 같도록 하는 X를 찾으면 됩니다. 따라서 이 두 행렬을 서로 빼주고 그 뺀 값을 최소화하는 함수를 만들어줍니다. 제가 만든 함수는 1X2행렬의 값을 제곱한 다음에(tf.square), 이 행렬 안의 두 값의 평균을 최소화 해야하는 cost값 으로 두었습니다.


그리고 tf.train.GradientDescentOptimizer라는 트레이닝 함수를 이용해서 이 cost를 최소화하는 X행렬을 찾아보겠습니다.


4. 학습

세션을 열어 변수들을 초기화한 다음 201회 트레이닝을 시켜 위의 결과를 얻었습니다. 보시는 바와 같이 처음의 임의의 값을 받았을 때는 cost값도 크고 행렬도 아무 의미가 없어 보이는 숫자를 보여주고 있습니다. 하지만 200번 트레이닝을 한 후에는 저희가 찾는 [[1, -1], [-1, 2]]에 매우 가까운 값을 얻었습니다.







오늘 실습해 본 내용의 코드입니다.


import tensorflow as tf

input_data = [[2., 1.], [1., 1.]]
output_data = [[1., 0.], [0., 1.]]

 x = tf.placeholder(tf.float32, shape=[None, 2], name = 'x')
y_ = tf.placeholder(tf.float32, shape=[None, 2], name = 'y_')
X = tf.Variable(tf.truncated_normal(shape=[2, 2]), dtype=tf.float32, name = 'W')

tensor_map = {x: input_data, y_: output_data}
y = tf.matmul(x, X)
sub = tf.subtract(y, y_)
cost = tf.reduce_mean(tf.square(sub))

learning_rate = 0.5
train = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)


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

for i in range(201):
    _, loss, matrix = sess.run([train, cost, X], feed_dict=tensor_map)
   
    if i % 100 == 0:
        print "--------------------------"
        print "Step: ", i
        print "loss: ", loss
        print "계산된 행렬"
        print matrix
        print "--------------------------"

sess.close()




지금 만들어본 프로그램은 매우 간단합니다. 하지만 만약 특징이 되는 데이터들이 무게, 길이, 부피, 밀도, 색깔이 다른 특징을 갖고 있고 100,000개를 4가지로 분류하는 행렬을 찾으려면 각 파라미터를 손으로 계산하기란 거의 불가능에 가까울 것 입니다. 그리고 이러한 행렬들이 몇 차로 곱해진다면 계산하기는 훨씬 어렵지만 더욱 복잡한 특징을 정확하게 찾아내는 파라미터들을 찾을 수 있을 것 입니다. 이러한 기법들이 Neural Network, CNN, RNN 이라고 표현되는 것들 입니다. 다음 강좌에서 Neural Network 실습을 해보고 CNN과 RNN을 구현해보고 금융에서 데이터를 예측하거나 통계를 분석하는 등 실생활에서 적용할 수 있는 프로그램도 만들어 보도록 하겠습니다.



TensorFlow 기본 사용법 VI (API 활용법)



※ 작성된 자료는 TensorFlow 공식 홈페이지(https://www.tensorflow.org)의 내용을 기반으로 작성했습니다.



페이스북에 공유하기