[텐서플로우 정리] 03. 관계 연산, 논리 연산

텐서플로우에서 제공하는 관계 연산과 논리 연산 함수에 대해 살펴 본다.
관계 연산은 참(True)과 거짓(False)을 만들어 내고, 논리 연산은 참과 거짓을 갖고 계산을 한다.

import tensorflow as tf
import functions

c1, c2, c3 = tf.constant([1, 2]), tf.constant([1.0, 2.0]), tf.constant([1])
v1, v2 = tf.Variable([1, 3]), tf.Variable([1.0, 3.0])

print('-----------equal------------')
functions.showOperation(tf.equal(c1, v1)) # [ True False]
functions.showOperation(tf.equal(c2, v2)) # [ True False]
# functions.showOperation(tf.equal(c1, c2)) # error. different type.

print('-----------not_equal------------')
functions.showOperation(tf.not_equal(c1, v1)) # [False True]
functions.showOperation(tf.not_equal(c2, v2)) # [False True]
# functions.showOperation(tf.not_equal(c1, c3)) # error. different size.

print('-----------less------------')
functions.showOperation(tf.less(c1, v1)) # [False True]
functions.showOperation(tf.less(c2, v2)) # [False True]

print('-----------less_equal------------')
functions.showOperation(tf.less_equal(c1, v1)) # [ True True]
functions.showOperation(tf.less_equal(c2, v2)) # [ True True]

print('-----------greater------------')
functions.showOperation(tf.greater(c1, v1)) # [False False]
functions.showOperation(tf.greater(c2, v2)) # [False False]

print('-----------greater_equal------------')
functions.showOperation(tf.greater_equal(c1, v1)) # [ True False]
functions.showOperation(tf.greater_equal(c2, v2)) # [ True False]

c4 = tf.constant([[1, 3], [5, 7]])
v4 = tf.Variable([[2, 4], [6, 8]])

# if True, select c4. if False, select v4.
cond1 = tf.Variable([[True, True ], [False, False]])
cond2 = tf.Variable([[True, False], [False, True ]])

print('-----------select------------')
functions.showOperation(tf.select(cond1, c4, v4)) # [[1 3] [6 8]]
functions.showOperation(tf.select(cond2, c4, v4)) # [[1 4] [6 7]]

c5 = tf.constant([[True , True], [False, False]])
v5 = tf.Variable([[False, True], [True , False]])

functions.showOperation(tf.where(c5)) # [[0 0] [0 1]]
functions.showOperation(tf.where(v5)) # [[0 1] [1 0]]

functions.showOperation(tf.select(cond1, c4, v4)) # [[1 3] [6 8]]
functions.showOperation(tf.select(cond2, c4, v4)) # [[1 4] [6 7]]

print('-----------and, or, xor, not------------')
functions.showOperation(tf.logical_and(c5, v5)) # [[False True] [False False]]
functions.showOperation(tf.logical_or (c5, v5)) # [[ True True] [ True False]]
functions.showOperation(tf.logical_xor(c5, v5)) # [[ True False] [ True False]]
functions.showOperation(tf.logical_not(c5)) # [[False False] [ True True]]

결과를 보면 함수가 하는 역할을 알 수 있기 때문에 별도의 주석을 달지 않았는데, select 함수의 경우는 결과를 보고 이해하기가 쉽지 않다. select 함수의 두 번째 매개변수는 참일 때 사용하고, 세 번째 매개변수는 거짓일 때 사용한다. 첫 번째 매개변수로 전달된 참과 거짓 값으로부터 참이라면 앞에 오는 것을, 거짓이라면 뒤에 오는 것을 선택하는 구조이다.

c = tf.Variable([1, 2])
v = tf.Variable([3, 4])
showOperation(tf.select([True, False], c, v))       # [1 4]
showOperation(tf.select([True, False], v, c))       # [3 2]

c와 v를 전달한다면 c는 참일 때 사용하고, v는 거짓일 때 사용한다. 마지막 줄에서처럼 순서를 바꾸면, 결과도 달라진다.