텐서

텐서 (Tensor)

PyTorch에서 모든 데이터는 텐서(tensor) 라는 다차원 배열로 표현돼요. 리스트나 넘파이 배열처럼 보이지만, GPU에서 연산되거나 자동 미분(autograd)으로 추적되는 등 신경망 학습에 필요한 기능이 기본으로 붙어 있죠. 가장 흔한 만큼, 처음 만나는 텐서의 생성 방법과 핵심 성질만 확실히 잡아 두면 나머지는 자연스럽게 따라와요.

출처: PyTorch 공식 문서 — torch.Tensor

텐서 만들기

가장 기본은 torch.tensor() 로 값을 직접 넘기는 방식이에요. 한 가지 주의할 점은 데이터로 텐서를 넘기면 원본 텐서의 별칭(alias)이 되는 대신 torch.tensor() 는 항상 새 텐서를 만든다는 점이에요.

>>> x = torch.tensor(2.5)
>>> x
tensor(2.5000)
>>> x.item()
2.5

torch.zeros(), torch.ones() 처럼 특정 모양으로 채워 만드는 팩토리 함수도 자주 써요. dtype 으로 원소 타입을, device 로 어느 장치에 만들지 지정할 수 있어요.

>>> torch.zeros([2, 4], dtype=torch.int32)
tensor([[ 0,  0,  0,  0],
        [ 0,  0,  0,  0]], dtype=torch.int32)
>>> cuda0 = torch.device('cuda:0')
>>> torch.ones([2, 4], dtype=torch.float64, device=cuda0)
tensor([[ 1.0000,  1.0000,  1.0000,  1.0000],
        [ 1.0000,  1.0000,  1.0000,  1.0000]], dtype=torch.float64, device='cuda:0')

requires_grad 와 자동 미분

텐서를 만들 때 requires_grad=True 를 주면 torch.autograd 가 이 텐서에 가해진 연산을 기록해 두고, 나중에 역전파로 기울기를 계산할 수 있게 돼요. requires_grad_() 메서드로 만들어진 뒤에도 in-place로 바꿀 수 있어요.

저장소와 뷰

텐서마다 데이터를 담는 torch.Storage 가 연결돼 있고, 텐서 클래스는 이 저장소의 다차원·strided 뷰(view) 와 숫자 연산을 제공해요. 같은 저장소를 여러 텐서가 공유하는 뷰 개념은 메모리를 아끼는 PyTorch의 핵심이라, 자세한 내용은 Tensor Views 문서를 따로 보면 좋아요.

이름 규칙

  • in-place 연산은 밑줄 접미사로 구분돼요. torch.FloatTensor.abs_() 는 제자리에서 절댓값을 계산해 원본을 바꾸고, torch.FloatTensor.abs() 는 새 텐서로 결과를 돌려줘요.
  • 기존 텐서의 devicedtype 을 바꾸고 싶으면 to() 메서드를 쓰는 걸 권장해요.

더 알아보기