# 파이썬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 |