텐서 표현과 연산
텐서(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 |