본문 바로가기

개발 공부/딥러닝

[DeepLearning] PyTorch Tensor 생성 연산과 Shape 변환

1. Tensor란 무엇인가

Tensor는 PyTorch에서 데이터를 저장하고 연산하는 기본 자료구조다.
NumPy의 ndarray와 비슷하지만 GPU로 이동할 수 있고, 자동 미분을 이용한 딥러닝 학습에 사용할 수 있다.

Python List와 NumPy Array를 모두 Tensor로 바꿀 수 있다.
`torch.from_numpy()`로 만든 Tensor는 조건에 따라 원본 NumPy Array와 메모리를 공유하므로 한쪽의 변경이 다른 쪽에 반영될 수 있다.

⠀

2. Shape과 Dimension

3은 행의 개수이고 2는 열의 개수다.
`(3, 2)`를 3차원이라고 생각하기 쉽지만, Shape에 숫자가 두 개이므로 2차원 Tensor다.

Shape Dimension 해석
(3,) 1차원 원소 3개인 Vector
(3, 2) 2차원 3행 2열 Matrix
(2, 3, 4) 3차원 크기 3×4인 Matrix가 2개

📌 이해 보충 | 차원 수는 Shape 안에 있는 숫자의 개수이고, 각 숫자는 그 차원의 크기다.
  `(10, 3, 5)`의 첫 번째 값 10이 크다고 해서 10차원이 되는 것은 아니다.

⠀

3. Tensor 생성 함수

함수 생성되는 값
torch.rand 0 이상 1 미만의 균등분포 난수
torch.randn 평균 0 표준편차 1의 표준정규분포 난수
torch.ones 모든 원소가 1
torch.zeros 모든 원소가 0
torch.empty 초기화하지 않은 메모리 공간

⚠ 정확성 보완 | `torch.empty()`의 출력에 숫자가 보이더라도 랜덤값을 생성한 것이 아니다.
  메모리에 남아 있던 값이 보일 수 있으므로 값을 채우기 전에 사용하면 안 된다.

⠀

4. Shape dtype device

속성 확인하는 정보
shape 각 차원의 크기
dtype float32 int64 같은 데이터 타입
device CPU 또는 CUDA GPU 중 Tensor가 위치한 장치

📌 이해 보충 | 모델의 Weight와 입력 Tensor는 서로 계산할 때 직접 만나야 하므로 같은 장치의 메모리에 있어야 한다.
예를 들어 모델은 GPU에 있고 입력 데이터는 CPU에 있으면 서로 다른 메모리에 저장되어 있어 바로 연산할 수 없다.
따라서 model.to(device)와 tensor.to(device)를 사용해 둘을 모두 CPU 또는 모두 GPU로 맞춰야 한다.

⠀

5. Indexing

쉼표 앞은 행, 뒤는 열을 선택한다.
`:`는 해당 차원의 모든 값을 의미하고, `...`은 앞쪽 차원을 그대로 유지한 채 뒤에서 지정한 차원을 선택한다.

⠀

6. cat과 stack

함수 차원 변화 핵심
cat 차원 수 유지 기존 차원 중 하나를 따라 이어 붙임
stack 차원 수 1 증가 새로운 차원을 만든 뒤 Tensor를 쌓음

⠀

7. Matrix Multiplication

2차원 Matrix Multiplication에서는 앞 Matrix의 열 수와 뒤 Matrix의 행 수가 같아야 한다.

`(2, 3) × (3, 3)`에서는 안쪽의 3과 3이 같아 계산할 수 있고, 결과 Shape은 바깥쪽 숫자인 `(2, 3)`이 된다.

⠀

8. Batch Matrix Multiplication

10개의 `(3, 5) × (5, 2)` Matrix Multiplication을 Batch 단위로 계산한 것이다.
Batch 크기 10은 그대로 유지되고, 뒤쪽 두 차원에서 Matrix Multiplication이 수행된다.

⠀

9. item과 In place 연산

`.item()`은 원소가 하나인 Tensor에서 Python 숫자를 꺼낸다.
Random Index처럼 Python 정수가 필요한 곳에서 자주 사용한다.

# t와 n이 메모리를 공유하면 둘 다 바뀔 수 있음

📌 이해 보충 | 함수 이름 끝의 `_`는 기존 Tensor 자체를 바꾸는 In place 연산을 뜻한다.
  원본이 필요한 경우에는 무심코 사용하지 않도록 주의한다.

⠀

10. reshape와 permute

함수 무엇을 바꾸는가 조건
reshape 전체 원소를 다른 Shape으로 재구성 전후 원소 수가 같아야 함
permute 기존 차원의 순서 모든 차원 번호를 한 번씩 지정

reshape() : 괄호 안에 적힌 항목의 개수가 결과의 차원 수가 되고, -1은 그중 한 자리의 크기만 자동으로 계산한다.
permute(0, 2, 1) : 기존 차원을 0번 → 2번 → 1번 순서로 재배치한다.

⠀

11. unsqueeze와 squeeze

x.unsqueeze(0).shape # (1, 2, 3, 4)
x.unsqueeze(1).shape # (2, 1, 3, 4)
x.unsqueeze(-1).shape # (2, 3, 4, 1)

`unsqueeze()`는 지정한 위치에 크기 1인 새 차원을 추가한다.
  반대로 `squeeze()`는 크기가 1인 차원을 제거한다.

📌 이해 보충 | `squeeze(dim=1)`처럼 차원을 지정했더라도
  해당 차원의 크기가 1이 아니면 제거되지 않고 원래 Shape이 그대로 반환된다.

⠀

핵심 정리

코드 역할
torch.tensor Python 데이터에서 Tensor 생성
torch.from_numpy NumPy Array를 Tensor로 변환
shape dtype device Tensor의 구조 타입 장치 확인
cat stack 기존 차원 연결 또는 새 차원으로 쌓기
mm bmm 2차원 또는 Batch Matrix Multiplication
item 원소 하나인 Tensor를 Python 값으로 변환
reshape permute Shape 재구성 또는 차원 순서 변경
unsqueeze squeeze 크기 1인 차원 추가 또는 제거



반응형