Deeplearning framework는 기본적으로 Tensor를 다루는 도구다.
Tensor를 다룰 때 가장 중요한 것!
SHAPE !!!
tf.constant()
import tensorflow as tf
import numpy as np
li_ten = tf.constant([1, 2, 3])
# <tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 3], dtype=int32)>
li_ten_f = tf.constant([1., 2., 3.])
# <tf.Tensor: shape=(3,), dtype=float32, numpy=array([1., 2., 3.], dtype=float32)>
tu_ten = tf.constant(((1, 2, 3), (1, 2, 3)), name="sample")
'''
<tf.Tensor: shape=(2, 3), dtype=int32, numpy=
array([[1, 2, 3],
[1, 2, 3]], dtype=int32)>
'''
arr = np.array([1., 2., 3.])
arr_ten = tf.constant(arr)
# <tf.Tensor: shape=(3,), dtype=float64, numpy=array([1., 2., 3.])>
arr_ten.numpy(), type(arr_ten.numpy())
# (array([1., 2., 3.]), numpy.ndarray)
li_ten.numpy(), type(li_ten.numpy())
# (array([1, 2, 3], dtype=int32), numpy.ndarray)
not_a_matrix = [[1,2,3], [4, 5], [6, 7, 8]]
# list, tf.constant(not_a_matrix) 에러
tf.matmul(li_ten, tu_ten)
→ li_ten * tu_ten = shape(3, ) * shape(2, 3)
dimension 맞지 않음.tf.matmul(tu_ten, li_ten)
랭크 수가 맞지 않음arr_ten * li_ten
dtype 다르므로 불가li_ten.shape, tu_ten.shape
(TensorShape([3]), TensorShape([2, 3]))
arr_ten.dtype, li_ten.dtype
(tf.float64, tf.int32)
print(li_ten.ndim) # rank 수
print(tu_ten.ndim)
tf.cast
(다만, 많은 경우 미리 데이터타입을 정리해둘 수 있다.)# 미리 지정
tensor = tf.constant([1, 2, 3], dtype=tf.float32)
# tf.cast를 사용
tf.cast(tensor, dtype=tf.int16)
# 에러없이 연산
arr_ten * tf.cast(li_ten, tf.float64)
tf.ones
tf.zeros
tf.range
tf.ones(1)
# <tf.Tensor: shape=(1,), dtype=float32, numpy=array([1.], dtype=float32)>
tf.zeros((2, 5), dtype="int32")
'''
<tf.Tensor: shape=(2, 5), dtype=int32, numpy=
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]], dtype=int32)>
'''
tf.zeros((2, 5, 3), dtype="int32")
'''
<tf.Tensor: shape=(2, 5, 3), dtype=int32, numpy=
array([[[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]],
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]], dtype=int32)>
'''
tf.range(1, 11)
# <tf.Tensor: shape=(10,), dtype=int32, numpy=array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=int32)>
n 을 입력하면 첫항이 1이고 공비가 2인 등비수열을 생성하는 함수를 만드시오
(이 때 결과값은 tf.Tensor 데이터이고, 데이터 타입은 tf.int32)
def geometric_sequence(n):
r = tf.range(n, dtype=tf.int32)
# r = tf.range(n, 'int32')
s = tf.ones(n, dtype=tf.int32) * 2
return s**r
print(geometric_sequence(10))
tf.random
에 구현 되어 있음.tf.random.normal
tf.random.uniform
shape = (3, 3)
tf.random.normal(shape)
# tf.random.normal(shape, mean=100, stddev=10)
tf.random.uniform(shape)
tf.random.set_seed({seed_number})
seed = 7777
tf.random.set_seed(seed)
a = tf.random.uniform([1])
b = tf.random.uniform([1])
print(a, b, sep="\n")
# tf.Tensor([0.959749], shape=(1,), dtype=float32)
# tf.Tensor([0.8677443], shape=(1,), dtype=float32)
a = tf.random.uniform([1])
b = tf.random.uniform([1])
print(a, b, sep="\n")
# tf.Tensor([0.22878075], shape=(1,), dtype=float32)
# tf.Tensor([0.87772965], shape=(1,), dtype=float32)
#setting 다시 불러오기
tf.random.set_seed(seed)
a = tf.random.uniform([1])
b = tf.random.uniform([1])
print(a, b, sep="\n")
# tf.Tensor([0.959749], shape=(1,), dtype=float32)
# tf.Tensor([0.8677443], shape=(1,), dtype=float32)
Reference
1) 제로베이스 데이터스쿨 강의자료