본문 바로가기

AI Theory/key concept of AI

텐서 표현과 연산

텐서 표현과 연산

텐서(Tensor)는 데이터를 담기위한 컨테이너(container)로서, 다차원 배열 또는 리스트 형태와 유사하다.

일반적으로 수치형 데이터를 저장하고, 동적 크기를 가진다.

  • Rank: 축(차원)의 개수
  • Shape: 형상(각 축의 요소의 개수)
  • Type: 데이터 타입

텐서의 종류

0D Tensor(scalar)

  • 하나의 숫자를 담고 있는 텐서
  • 축과 형상이 없다.
t0 = tf.constant(1) # 상수 텐서 제작
tf.rank(t0) # t0 텐서의 축 개수 반환: 0

1D Tensor(Vector)

  • 리스트와 유사한 텐서
  • 하나의 축 존재
t1 = tf.constant([1, 2, 3])
tf.rank(t1) # 1

2D Tensor(Matrix)

  • 행렬과 같은 모양
  • 2개의 축 존재
  • 수치, 통계 데이터셋이 여기에 해당
  • 주로 sample과 feature를 가진 구조 형태

3D Tensor

  • 큐브와 같은 모양
  • 3개의 축 존재
  • 데이터가 연속된 시퀸스 데이터, 시간 축이 포함된 시계열 데이터
  • sample, timestep, feature를 가진 구조
  • 주식 가격 데이터셋, 시간에 따른 질병 발명 데이터 등
t3 = tf.constant([[[1,2,3]],[[4,5,6]],[[7,8,9]]])
print(tf.rank(t3))

4D Tensor

  • 4개의 축 존재
  • 컬러 이미지가 대표적인 사례
  • sample, height, width, channel로 구성

5D Tensor

  • 5개의 축이 존재하는 데이터
  • sample, frames, height, width, channel
  • 비디오 데이터

텐서 타입 및 변환

기본 데이터 타입(dtype)으로 int32, float32, string 등이 있다.

데이터 입력시 자동으로 텐서 데이터 타입이 정해지지만, 필요한 경우 텐서의 타입을 지정해서 생성할 수 있다.

f16 = tf.constant(2., dtype=tf.float16)
f16

텐서 변환

텐서가 생성된 후 변환할 수 있다.

텐서 타입 변환: tf.cast()

f32 = tf.cast(f16, tf.float32) # 16비트 실수형인 f16을 float32로 변형

텐서 형상 변환: tf.reshape()

  • 텐서의 원소는 그대로 유지하며 텐서 구조를 바꾼다.
x = tf.constant([[1], [2], [3]])
print(x)
print(x.shape)

y = tf.reshape(x, [1, 3]) # (1,3) 형태로 변경
print(y)
print(y.shape)

텐서 전치: tf.transpose()

print(y)
print(tf.transpose(y))
print(y.shape)

차원 압축: tf.squeeze()

텐서에서 크기가 1인 차원을 제거한다

print(x)
print(tf.squeeze(x))

차원 추가: tf.expand_dims()

print(y)
print(tf.expand_dims(y, axis=0))
print(tf.expand_dims(y, axis=1))
print(tf.expand_dims(y, axis=2))

텐서 분리: tf.split()

텐서의 지정한 차원을 기준으로 여러 개의 텐서로 구분한다.

print(x)
print(tf.split(x, 3)) # 텐서 x를 3개로 분리

텐서 연결: tf.concat()

지정한 축 axis를 기준으로 텐서들을 붙임

print(x)
print(tf.concat([x, x], axis=0))
print(tf.concat([x, x], axis=1))

그외 텐서 변환 함수들

(출처:: 모두의 연구소)

텐서 연산

  • 주의! 서로 다른 타입을 갖는 텐서 간에는 연산이 되지 않는다
  • 따라서 tf.cast를 이용해 텐서 타입을 맞춰준 뒤 연산을 수행해야 한다.
print(tf.cast(tf.constant(2), tf.float32) + tf.constant(2.2))

1차원 이상의 텐서 연산

  • 텐서 모양이 직사각형이거나 연산이 가능하도록 shape를 맞춰줘야 한다.
# 요소별 연산
print(a + b) # element-wise addition
print(a - b) # element-wise subtraction
print(a * b) # element-wise multiplication
print(a / b) # element-wise division

# 행렬곱 연산
print(a @ b) # matrix multiplication

# 함수 활용
print(tf.add(a, b))
print(tf.subtract(a, b))
print(tf.multiply(a, b))
print(tf.matmul(a, b))
print(tf.divide(a, b))

# 그외 유용한 함수들
c = tf.constant([[4.0, 5.0, 6.0], 
                 [10.0, 9.0, 8.0]])

print(tf.reduce_max(c)) # 텐서들 중 최대값 계산: 10.0
print(tf.argmax(c)) # 최대값의 위치 반환: [1 1 1]
print(tf.nn.softmax(c)) # 텐서의 값을 0~1 사이 값으로 변환

'AI Theory > key concept of AI' 카테고리의 다른 글

모델 크기 조절과 규제  (0) 2023.07.25
딥러닝 구조와 모델  (0) 2023.07.24
[CV] GAN 과 cGAN  (0) 2023.07.18
[NLP] Text Summarization  (0) 2023.07.17
사이킷런을 활용한 추천 시스템  (0) 2023.07.07