본문 바로가기

Deep Learning/PyTorch

텐서(Tensor)의 구조와 기능

텐서(Tensor)는 딥러닝 프레임 워크에 있어서, 가장 기본이 되는 데이터 구조이다.

기본적인 Python 문법 혹은 Numpy 라이브러리와 유사한 사용법을 지니며,
Numpy의 ndarray로의 변환도 가능하다 (단, 변환이전에 GPU에서 CPU로 텐서를 이동해야함!).
CPU와 GPU상에서 개별적 텐서의 생성이 가능하며, Data Type도 별도로 지정이 가능하다.
(아래의 그림을 참조바랍니다.)

[그림] PyTorch를 통한 텐서의 생성

물론 CPU에서 텐서를 생성하고 추후 GPU로 전송하는것 역시 가능합니다.

[그림] CPU텐서를 GPU텐서로 바꾸는 방법

앞서 소개한 내용중 GPU상에 위치한 텐서를 Numpy ndarray로 변환하기위해서는
CPU로 그 위치를 바꾸어 주어야한다고 설명하였습니다 (이 때, to 메서드를 사용함).
물론 CPU상에 위치한 텐서는 .numpy() 메서드로 바로 변환이 가능합니다.

[그림] Tensor to Numpy ndarray

이러한 텐서는 파이썬의 리스트처럼  인덱싱을 통해 배열 내부에 있는 값들에 접근 및 수정할 수 있다.

[그림] 텐서 인덱싱을 통한 배열내 값 호출 및 수정 예시

그렇다면 다시 원점으로 돌아가서 왜 이 Tensor를 사용하는 것일까??
현재 파이썬 기반의 연산에서 보편적으로 많이 사용되고있는 라이브러리는 Numpy 또는 SciPy이다.
이들은 사칙연산, 선형대수적 계산에 최적화되어 초심자들도 쉽게 고급연산을 가능케 해주는 소중한 존재인데,
GPU기반의 연산에서 최적화된것이 아니라(CPU기반 연산임) GPU를 통한 대규모 데이터 연산을
원한다면 NumPy 혹은 SciPy 보다 Tensor를 통한 연산을 수행하는게 더 효율적이다 (항상 x).   

좋다. 이제 우리는 왜 Tensor 기반의 연산기법을 사용해야하는지 알고있다.
하지만 잘 사용하기 위해서는 다음 사항들을 반드시 기억해야한다.

첫 째, 기본 적인 사칙연산은 같은 텐서 끼리 혹은 텐서와 파이썬 스칼라값 사이에서만 가능함.
둘 째, 각 텐서가 가지고 있는 데이터형이 일치해야함. (e.g. Float Tensor + Float Tensor)
셋 째, Numpy의 ndarray와 같이 Broadcasting기능을 제공하며, 연산시 두 차원 중 큰 차원의 크기를 따름.
넷 째, 텐서에 사용되는 대부분의 함수는 텐서의 메서드로도 사용이 가능함.

 

마지막으로 텐서를 기반한 선형대수적 연산을 도와줄 소중한 명령어들을 소개하면서 글을 마칩니다.^^

텐서 연산자 설명
mv 행렬과 벡터의 곱을 계산함
mm 행렬과 행렬의 곱을 계산함
matmul 인수의 종류에 따라 mv, mm등을 자동으로 계산함.
dot 두 벡터간의 내적을 구함.
gesv LU 분해를 사용한 연립 방정식의 해를 구함.
svd 특이값 분해를 연산함.
eig, symeig 고유값 분해를 연산함.
symeig은 대칭행렬보다 효율이 좋은 알고리즘이라고 함.