반응형

간단한 계산을 하는 텐서플로우 프로그램을 통해 어떻게 동작하는지 알아봅니다.



다음 사이트에 있는 텐서플로우 예제들을 공부한 결과를 비정기적으로 올릴 예정입니다.

https://github.com/aymericdamien/TensorFlow-Examples






텐서플로우 2.0에서 텐서플로우 1.x 코드를 실행하는 방법을 설명합니다. 


Tensorflow 2.0에서 Tensorflow 1.x 코드 실행하기

https://webnautes.tistory.com/1393



본 포스팅에서는 저수준 텐서플로우 API인 텐서플로우 코어(TensorFlow Core)를 중심으로 설명합니다.

텐서플로우 코어를 사용한 프로그래밍은 다음 두 단계로 이루어집니다.


  1. 수식을 그래프로 표현


     2. 그래프 실행




# 파이썬2와 파이썬3에서 동일한 코드를 가지고 실행하기 위해서 필요합니다.
from __future__ import print_function
# tensorflow 모듈을 임포트(import)하는 순간 디폴트 그래프 객체가 생성됩니다.
import tensorflow as tf



# 다음처럼 하면 디폴트 객체에 추가되있는 오퍼레이션 객체를 리스트로 출력해볼 수 있습니다.
# 현재는 아무 오퍼레이션도 추가되있지 않기 때문에 리스트가 비어있습니다.
print(tf.get_default_graph().get_operations())
# []

# 상수 오퍼레이션을 생성하여 그래프에 추가하고 오퍼레이션의 출력 텐서를 변수가 가리키도록 합니다.

# 파이썬에서 모든 것은 객체이며 변수는 해당 객체를 가리킵니다.
a = tf.constant(2)
b = tf.constant(3)
c = tf.constant(4)


# 디폴트 그래프 객체에 추가되있는 오퍼레이션을 출력해보면 tf.constant 함수 호출로 인해 그래프에 오퍼레이션이 추가된 것을 볼 수 있습니다.
# 이름을 붙여주지 않았기 때문에 상수 오퍼레이션의 디폴트 이름인 Const를 사용하고 있습니다.
# 텐서플로우에서는 똑같은 객체를 이름 붙이지 않고 생성하면 뒤에 _1, _2 처럼 숫자를 붙여서 이름을 짓습니다.
# type=Const는 상수 텐서를 출력하는 오퍼레이션이라는 의미입니다.
print(tf.get_default_graph().get_operations())
# [<tf.Operation 'Const' type=Const>, <tf.Operation 'Const_1' type=Const>, <tf.Operation 'Const_2' type=Const>]



# 변수 a, b, c를 출력해도 값 2, 3, 4가 바로 출력되지 않습니다.
# 대신 텐서 객체 정보를 보여줍니다.
#
# name 아규먼트를 사용하여 이름을 지정해주지 않으면 상수 텐서의 경우 "Const:0"이라는 이름을 갖습니다.
# "Const"는 상수 오퍼레이션이 출력하기 때문에 붙여지는 이름이며 뒤에 붙는 0은 출력 텐서의 인덱스입니다.
# shape=()는 텐서가 출력하는 값이 상수 텐서라는 의미입니다.
# dtype=int32는 텐서가 출력하는 값의 타입이 정수 32비트라는 의미입니다.
print(a)
print(b)
print(c)
# Tensor("Const:0", shape=(), dtype=int32)
# Tensor("Const_1:0", shape=(), dtype=int32)
# Tensor("Const_2:0", shape=(), dtype=int32)


# 다음처럼 a, b, c 변수가 가리키는 텐서를 출력하는 오퍼레이션을 출력해 볼 수 있습니다.
# 해당 텐서를 출력하게되는 오퍼레이션 객체의 정보를 보여줍니다.
# 파이썬 인터프리터에서 한줄씩 실행해 볼 경우에는 다음처럼 상세하게 안보이고 <tf.Operation 'Const' type=Const>처럼 출력됩니다.
print(a.op)
print(b.op)
print(c.op)
# name: "Const"    오퍼레이션의 이름입니다.
# op: "Const"      상수 텐서를 출력하는 오퍼레이션이라는 의미입니다.
# attr {
#   key: "dtype"
#   value {
#     type: DT_INT32   출력되는 텐서의 데이터 타입이 32비트 정수라는 의미입니다.
#   }
# }
# attr {
#   key: "value"
#   value {
#     tensor {
#       dtype: DT_INT32  출력되는 텐서가 갖게되는 데이터 타입이 32비트 정수라는 의미입니다.
#       tensor_shape {   상수 텐서라는 의미입니다.
#       }
#       int_val: 2       상수 오퍼레이션의 경우 그래프 객체에 출력될 값을 포함하여 추가됩니다.
#     }
#   }
# }
#
# name: "Const_1"
# op: "Const"
# attr {
#   key: "dtype"
#   value {
#     type: DT_INT32
#   }
# }
# attr {
#   key: "value"
#   value {
#     tensor {
#       dtype: DT_INT32
#       tensor_shape {
#       }
#       int_val: 3
#     }
#   }
# }
#
# name: "Const_2"
# op: "Const"
# attr {
#   key: "dtype"
#   value {
#     type: DT_INT32
#   }
# }
# attr {
#   key: "value"
#   value {
#     tensor {
#       dtype: DT_INT32
#       tensor_shape {
#       }
#       int_val: 4
#     }
#   }
# }


# 그래프 객체에 오퍼레이션 정보와 값이 함께 저장되있지만 상수 오퍼레이션의 입력을 출력해볼 수 없습니다.
print(a.op.inputs)
print(b.op.inputs)
print(c.op.inputs)
# <tensorflow.python.framework.ops.Operation._InputList object at 0x0000022F167BDEB8>
# <tensorflow.python.framework.ops.Operation._InputList object at 0x0000022F167BDFD0>
# <tensorflow.python.framework.ops.Operation._InputList object at 0x0000022F167D6198>


# tf.constant 함수의 결과를 가리키는 변수 a, b, c가 상수 오퍼레이션의 출력임을 다음처럼 확인할 수 있습니다.
print( a is a.op.outputs[0])
print( b is b.op.outputs[0])
print( c is c.op.outputs[0])
# True
# True
# True



# 앞에서 정의한 상수 텐서를 가지고 계산할 오퍼레이션을 추가합니다.
# 변수 d와 e도 각각 오퍼레이션의 출력 텐서를 가리키게 됩니다.
d = tf.add(a, b) # d = a + b로 해도 됩니다.
e = tf.multiply(c, d)  # e = d * c로 해도 됩니다.


# 텐서 d와 e를 출력하는 오퍼레이션은 다음과 같습니다.
print(d.op)
print(e.op)
# name: "Add"
# op: "Add"         텐서를 더하는 오퍼레이션입니다.
# input: "Const"    입력이 두 개 입니다.
# input: "Const_1"
# attr {
#   key: "T"
#   value {
#     type: DT_INT32
#   }
# }
#
# name: "Mul"
# op: "Mul"        텐서를 곱하는 오퍼레이션입니다.
# input: "Const_2"   입력이 두 개 입니다.
# input: "Add"
# attr {
#   key: "T"
#   value {
#     type: DT_INT32
#   }
# }

# 상수 오퍼레이션과 달리 입력 텐서도 출력해볼 수 있습니다
print('d.op의 입력')
for input in d.op.inputs:
   print(input)

print('e.op의 입력')
for input in e.op.inputs:
   print(input)
# d.op의 입력
# Tensor("Const:0", shape=(), dtype=int32)
# Tensor("Const_1:0", shape=(), dtype=int32)
# e.op의 입력
# Tensor("Const_2:0", shape=(), dtype=int32)
# Tensor("Add:0", shape=(), dtype=int32)



print('d.op의 출력')
for output in d.op.outputs:
   print(output)

print('e.op의 출력')
for output in e.op.outputs:
   print(output)
# d.op의 출력
# Tensor("Add:0", shape=(), dtype=int32)
# e.op의 출력
# Tensor("Mul:0", shape=(), dtype=int32)


# 세션에서 그래프를 실행합니다.
# 지정한 텐서를 출력하기 위해 필요한 모든 오퍼레이션이 계산됩니다.
with tf.Session() as sess:
   # 상수 오퍼레이션은 바로 계산 결과가 출력됩니다.
   print("a = %i" % sess.run(a)) # 변수가 가리키고있는 텐서 객체의 값을 long 타입 정수(%i)로 출력합니다.
   print("b = %i" % sess.run(b))
   print("c = %i" % sess.run(c))
   # a = 2
   # b = 3
   # c = 4

   # 덧셈 결과를 내놓기 위해서는 우선 a, b의 값을 구해야 합니다.
   print( "2 + 3 = %i" % sess.run(d))  # d = a + b
   # 2 + 3 = 5

   # 텐서플로우에서는 계산을 단계로 나눕니다.
   # 그래서  e = ( a + b) * c를 계산하기 위해 d = a + b, e = d * c로 나누어 계산합니다.
   #
   # 곱셈의 결과를 내놓기 위해선 우선 a와 b의 덧셈결과와 c의 값을 구해야 합니다.
   print( "( 2 + 3 ) * 5 = %i" % sess.run(e))
   # ( 2 + 3 ) * 5 = 20




원본 코드

https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/1_Introduction/basic_operations.py


마지막 업데이트 - 2018. 8. 17



반응형

해본 것을 문서화하여 기록합니다.
부족함이 있지만 도움이 되었으면 합니다.


포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">