다운로드
작성자: admin 작성일시: 2019-06-29 15:54:07 조회수: 213 다운로드: 22
카테고리: 기타 태그목록:

3.2 텐서 연산

이 절의 내용을 실행하려면 텐서플로우 2.0 버전을 임포트해야 한다.

In [1]:
# 코랩에서는 다음 코드로 베타버전을 설치한다.
# !pip install tensorflow-gpu==2.0.0-beta1
import tensorflow as tf
tf.__version__
Out:
'2.0.0-beta1'

Tensor 자료형의 연산은 TensorFlow가 제공하는 연산자를 사용해야 한다. 이 연산자의 이름은 NumPy나 SciPy에서 제공하는 연산자와 다르므로 별도로 외워야 한다.

기본 연산

다음과 같은 기본 연산은 특수 메서드를 이용하여 연산자 오버로딩이 되어 있으므로 그냥 연산자 기호를 사용해도 된다.

  • tf.add: 덧셈
  • tf.subtract: 뺄셈
  • tf.multiply: 곱셈
  • tf.divide: 나눗셈
  • tf.pow: n-제곱
  • tf.negative: 음수 부호
In [2]:
a = tf.range(6, dtype=tf.int32)      # [0, 1, 2, 3, 4, 5]
b = 2 * tf.ones(6, dtype=tf.int32)   # [2, 2, 2, 2, 2, 2]

tf.add(a, b).numpy()
Out:
array([2, 3, 4, 5, 6, 7], dtype=int32)
In [3]:
(a + b).numpy()
Out:
array([2, 3, 4, 5, 6, 7], dtype=int32)
In [4]:
(a - b).numpy()
Out:
array([-2, -1,  0,  1,  2,  3], dtype=int32)
In [5]:
(a * b).numpy()
Out:
array([ 0,  2,  4,  6,  8, 10], dtype=int32)
In [6]:
(a / b).numpy()
Out:
array([0. , 0.5, 1. , 1.5, 2. , 2.5])
In [7]:
(a ** 2).numpy()
Out:
array([ 0,  1,  4,  9, 16, 25], dtype=int32)
In [8]:
(-b).numpy()
Out:
array([-2, -2, -2, -2, -2, -2], dtype=int32)

연산자 오버로딩이 불가능한 연산은 사용할 때 주의한다.

  • tf.abs: 절대값
  • tf.sign: 부호
  • tf.round: 반올림
  • tf.ceil: 올림
  • tf.floor: 내림
  • tf.square: 제곱
  • tf.sqrt: 제곱근
  • tf.maximum: 두 텐서의 각 원소에서 최댓값만 반환.
  • tf.minimum: 두 텐서의 각 원소에서 최솟값만 반환.
  • tf.cumsum: 누적합
  • tf.cumprod: 누적곱
In [9]:
tf.maximum(a, b).numpy()
Out:
array([2, 2, 2, 3, 4, 5], dtype=int32)

벡터나 행렬의 원소들을 연산하여 스칼라 값을 구하는 차원 축소 연산은 tf.reduce_ 명령을 사용한다.

  • tf.reduce_all: 설정한 축으로 이동하면서 and논리 연산을 수행한다.
  • tf.reduce_any: 설정한 축으로 이동하면서 or논리 연산을 수행한다.
  • tf.reduce_mean: 설정한 축의 평균을 구한다.
  • tf.reduce_max: 설정한 축의 최댓값을 구한다.
  • tf.reduce_min: 설정한 축의 최솟값을 구한다.
  • tf.reduce_prod: 설정한 축의 요소를 모두 곱한 값을 구한다.
  • tf.reduce_sum: 설정한 축의 요소를 모두 더한 값을 구한다.
  • tf.reduce_logsumexp: 설정한 축의 벡터가 $N$차원의 벡터 $x$라고 할 때 $$ \log \left( \displaystyle\sum_{i=0}^N \exp x_i\right) $$
In [10]:
tf.reduce_sum(a).numpy()
Out:
15

자동 형변환

TensorFlow 연산자에 NumPy 배열이 들어가면 자동으로 상수 텐서 자료형으로 형변환(coercion)되어 연산이 이루어진다.

In [11]:
a = np.ones((2, 3), dtype=np.float32)
b = tf.ones([3, 1], dtype=tf.float32)
tf.matmul(a, b).numpy()
Out:
array([[3.],
       [3.]], dtype=float32)

행렬 연산

또한 행렬과 관련된 연산에서도 NumPy와는 이름이 다르므로 주의한다.

  • tf.matmul: 내적
  • tf.linalg.inv: 역행렬
In [12]:
a = tf.constant([[2, 0], [0, 1]], dtype=tf.float32)
b = tf.constant([[1, 1], [1, 1]], dtype=tf.float32)
tf.matmul(a, b).numpy()
Out:
array([[2., 2.],
       [1., 1.]], dtype=float32)
In [13]:
a = tf.constant([[2, 0], [0, 1]], dtype=tf.float32)
tf.linalg.inv(a).numpy()
Out:
array([[0.5, 0. ],
       [0. , 1. ]], dtype=float32)

신경망 함수

nn 서브패키지에는 신경망에서 쓰이는 함수들도 구현되어 있다.

  • tf.nn.sigmoid: 로지스틱 함수
  • tf.nn.softplus: 소프트플러스 함수
  • tf.nn.softsign: 소프트사인 함수
In [14]:
x = tf.linspace(-2.0, 2, 1000)
y1 = tf.nn.sigmoid(x)
y2 = tf.nn.softplus(x)
y3 = tf.nn.softsign(x)

plt.plot(x, y1, "-", label="sigmoid")
plt.plot(x, y2, "--", label="softplus")
plt.plot(x, y3, ":", label="softsign")
plt.xlabel("x")
plt.title("sigmoid, softplus, softsign")
plt.legend()
plt.show()

선형회귀 모형

In [15]:
w0 = tf.constant([[3.0], [5.0]])
w0.numpy()
Out:
array([[3.],
       [5.]], dtype=float32)
In [16]:
X = tf.concat([tf.ones((10, 1)), tf.random.normal((10, 1))], 1)
X.numpy()
Out:
array([[ 1.        , -0.58082664],
       [ 1.        ,  0.69138205],
       [ 1.        , -0.3126501 ],
       [ 1.        , -0.11550285],
       [ 1.        , -1.9208333 ],
       [ 1.        , -0.38512075],
       [ 1.        , -0.5557638 ],
       [ 1.        , -0.95488155],
       [ 1.        ,  1.3280771 ],
       [ 1.        , -0.10763278]], dtype=float32)
In [17]:
y_target = tf.matmul(X, w0) + tf.random.normal((10, 1))
y_target.numpy()
Out:
array([[-0.36257035],
       [ 6.306304  ],
       [ 2.144274  ],
       [ 0.9009416 ],
       [-8.309937  ],
       [ 1.7275507 ],
       [-1.2747622 ],
       [ 0.04071939],
       [ 9.762052  ],
       [ 2.5970652 ]], dtype=float32)
In [18]:
w = tf.constant([[0.0], [0.0]])
y_predict = tf.matmul(X, w)
y_predict.numpy()
Out:
array([[0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.]], dtype=float32)
In [19]:
plt.plot(X[:, 1], y_target, "ro")
plt.plot(X[:, 1], y_predict, "b-")
plt.show()
In [20]:
loss = tf.reduce_sum(tf.square(y_target - y_predict))
loss.numpy()
Out:
221.01909
In [21]:
w = tf.constant([[3.0], [3.0]])
y_predict = tf.matmul(X, w)
y_predict.numpy()
Out:
array([[ 1.2575201 ],
       [ 5.0741463 ],
       [ 2.0620496 ],
       [ 2.6534915 ],
       [-2.7624998 ],
       [ 1.8446378 ],
       [ 1.3327086 ],
       [ 0.13535547],
       [ 6.984231  ],
       [ 2.6771016 ]], dtype=float32)
In [22]:
loss = tf.reduce_sum(tf.square(y_target - y_predict))
loss.numpy()
Out:
52.539413
In [23]:
plt.plot(X[:, 1], y_target, "ro")
plt.plot(X[:, 1], y_predict, "b-")
plt.show()

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!