딥러닝 과정에 사용하는 N차원 배열(다차원 행렬)을 의미
ex) 0차원 텐서(스칼라, 5), 1차원 텐서(벡터, [1, 2, 3]), 2차원 텐서(행렬, [[1, 2, 3], [4, 5, 6]])
텐서의 핵심은 차원(rank)과 형상(shape), 데이터 타입(dtype)이라고 할 수 있음
딥러닝 모델 제작 중 가장 많이 발생하는 오류가 Shape 불일치 오류로 텐서의 Shape을 수시로 확인할 필요가 있으며, dtype이 같은 텐서끼리만 연산이 가능함에 유의
Tensor 생성
tf.constanttf.zeros, tf.ones, tf.fill, tf.eye크기 조작
tf.reshapetf.expand_dims, tf.squeezetf.tile, tf.repeat슬라이싱 및 인덱싱
tf.slicetf.gather, tf.gather_ndtf.boolean_mask결합/분리
tf.concat, tf.stacktf.split, tf.unstacktf.random 클래스 하위의 다양한 분포함수를 사용할 수 있음# shape이 (2,2) 이면서 평균이 0, 표준편차가 1인 정규분포 기반 난수
shape = (2,2)
print(tf.random.normal(shape, 0, 1))
# tf.Tensor(
# [[-1.3544159 0.7045493 ]
# [ 0.03666191 0.86918795]], shape=(2, 2), dtype=float32)
MY_SEED = 42
tf.random.set_seed(MY_SEED)
print(tf.random.uniform([1]))
# tf.Tensor([0.6645621], shape=(1,), dtype=float32)
상수는 값이 정해지면 변하지 않는 고정 값을 지칭
메모리 관리 측면에서는 상수가 훨씬 효율적임
# 리스트 이용 상수 생성
li_ten = tf.constant([1, 2, 3])
print(li_ten)
# tf.Tensor([1 2 3], shape=(3,), dtype=int32)
# 튜플 이용 상수 생성
tu_ten = tf.constant(
((1, 2, 3), (4, 5, 6,)),
name="tuple_tensor"
)
print(tu_ten)
# tf.Tensor(
# [[1 2 3]
# [4 5 6]], shape=(2, 3), dtype=int32)
# 배열 이용 상수 생성
import numpy as np
arr = np.array([1., 2., 3.,])
arr_ten = tf.constant(arr)
print(arr_ten)
# tf.Tensor([1. 2. 3.], shape=(3,), dtype=float64)
# 텐서에서 배열 추출
print(arr_ten.numpy())
# [1., 2., 3.,]
# rank, shape, dtype 확인
print(arr_ten.ndim) # 1
print(arr_ten.shape) # (3,)
print(arr_ten.dtype) # <dtype: 'float64'>
변수는 상수와 달리 값이 고정되지 않고, 사용자가 수정할 수 있음 (즉, 공간만 만들어놓았다고 생각할 수 있음)
보통 미지수, 가중치 등 변할 수 있는 값을 정의할 때 사용하지만 직접 사용할일이 많지는 않음
값을 변경할 때에는 assign() 함수를 사용하여햐 함
te_var = tf.Variable([1, 2, 3])
print(te_var)
# <tf.Variable 'Variable:0' shape=(3,) dtype=int32, numpy=array([1, 2, 3], dtype=int32)>
te_var.assign(tf.constant([4, 5, 6]))
print(te_var)
# <tf.Variable 'Variable:0' shape=(3,) dtype=int32, numpy=array([4, 5, 6], dtype=int32)>
tf.cast()를 이용하여 명시적 형변환 과정을 거쳐야 함# 다른 데이터 타입의 텐서 생성
float_tensor = tf.constant([[1.0, 2.0]], dtype=tf.float32)
int_tensor = tf.constant([[1, 2]], dtype=tf.int32)
try:
# 다른 타입 간 연산 시도
result = float_tensor + int_tensor
except tf.errors.InvalidArgumentError as e:
# InvalidArgumentError 발생
print("오류 발생:", e)
# 올바른 방법: 명시적 타입 변환 후 연산
result = float_tensor + tf.cast(int_tensor, dtype=tf.float32)
기본 산술 연산: '+', '-', '**', '@' 등 Python 기본 연산자를 사용하여도 자동 오버라이딩되어 텐서 간 연산 수행 가능
tf.addtf.subtracttf.multiplytf.dividetf.powtf.math.mod기초 수학 함수
tf.abstf.sqrttf.exptf.math.logtf.math.minimum, tf.math.maximum삼각 함수
tf.sintf.costf.tan선형 대수 연산
tf.matmultf.transposetf.linalg.invtf.linalg.svd기본 통계
tf.reduce_meantf.reduce_sumtf.reduce_max, tf.reduce_mintf.math.reduce_std정렬 및 순위
tf.sorttf.argsort, tf.argmax, tf.argmin비교 연산
tf.greater, tf.less, tf.greater_equal, tf.less_equaltf.equal, tf.not_equal논리 연산
tf.logical_and, tf.logical_or, tf.logical_not조건문
tf.wheretf.strings.jointf.strings.splittf.strings.to_number, tf.strings.format활성화 함수
tf.nn.relutf.nn.sigmoidtf.nn.softmax손실 함수
tf.keras.losses.MeanSquaredErrortf.keras.losses.CategoricalCrossentropy합성곱
tf.nn.conv2dtf.nn.conv1d풀링
tf.nn.max_pooltf.nn.avg_pooltf.data.Dataset.from_tensor_slices, tf.data.Dataset.rangemap, filter, batch, shuffle*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.