Tensor의 개념
Pytorch의 기본 단위인 Tensor는 다차원 배열(n-dimension array)를 의미한다. 행렬과 혼동하기 쉬운데, Tensor는 2차원을 넘어, 3차원, 4차원, ... n차원으로 데이터를 표현할 수 있다.
정리하자면, tensor는 0차원의 scalar, 1차원의 vector, 2차원의 matrix, 그리고 3차원 이상의 고차원 배열을 표현할 수 있다.
tensor의 차원은 rank라 부르며, pytorch에서 tensor의 각 차원은 다음과 같이 구분된다.
1. Scalar (0차원 tensor)
- 하나의 숫자 데이터 (ex. $x=5$)
- Pytorch 차원: torch.tensor(5) -> rank = 0 (차원 없음)
2. Vector (1차원 tensor)
- 숫자의 1차원 배열 (list 형태. ex. $x=[1, 2, 3]$)
- PyTorch 차원: torch.tensor([1, 2, 3]) -> rank = 1 (1D tensor)
3. Matrix (2차원 tensor)
- 숫자의 2차원 배열 (행렬)
- ex. $x = \begin{bmatrix}
1 & 2 & 3 \\
4 & 5 & 6
\end{bmatrix}$ - PyTorch 차원: torch.tensor([[1, 2, 3], [4, 5, 6]]) -> rank = 2 (2D tensor)
4. 3차원 이상
- 3차원 이상의 배열로 구성된 데이터
Tensor는 다음과 같은 역할을 수행한다.
Dimension | Role of Tensor |
0D | loss(손실값)이나 accuracy(정확도)같은 scalar 값 |
1D | 입력 vector, feture(특성) |
2D | 가중치 행렬, 데이터 표 |
3D | 컬러 이미지 데이터 |
4D | 비디오, 배치 데이터 등 |
Tensor 관련 함수
1. torch.empty()
import torch
import numpy as np
x = torch.empty(5, 4)
print(x)
tensor([[-1.6269e-19, 1.0286e-42, 0.0000e+00, 0.0000e+00],
[ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
[ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
[ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
[ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]])
torch.empty(n, m)은 n x m의 빈 tensor를 생성한다. 이때 초기화되지 않은 행렬일 경우 해당 시점에 메모리에 존재하던 값들이 초기값으로 설정된다. 생성한 tensor는 다음과 같이 to("cuda")를 통해 GPU로 이동시켜 연산하도록 할 수 있다.
import torch
import numpy as np
x = torch.empty(5, 4).to("cuda")
print(x)
tensor([[-2.0140e+08, 2.0095e-42, 0.0000e+00, 0.0000e+00],
[ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
[ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
[ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00],
[ 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]], device='cuda:0')
2. torch.ones
import torch
import numpy as np
x = torch.ones(3, 3)
print(x)
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
torch.ones(n, m) 함수는 n x m의 모든 원소가 1인 행렬을 생성한다.
import torch
import numpy as np
x = torch.ones(3, 3).to("cuda")
print(x)
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], device='cuda:0')
3. torch.zeros()
import torch
import numpy as np
x = torch.zeros(2, 3)
print(x)
tensor([[0., 0., 0.],
[0., 0., 0.]])
torch.zeros(n, m)은 n x m 의 영행렬을 생성한다.
4. torch.rand()
import torch
import numpy as np
x = torch.rand(5, 6).to("cuda")
print(x)
tensor([[0.2178, 0.0324, 0.2413, 0.5541, 0.8449, 0.3677],
[0.7759, 0.5758, 0.8198, 0.9102, 0.2131, 0.5702],
[0.9372, 0.5995, 0.6485, 0.5684, 0.8426, 0.6511],
[0.7362, 0.1663, 0.2337, 0.6261, 0.9473, 0.8144],
[0.2720, 0.2181, 0.9712, 0.5163, 0.2395, 0.5151]], device='cuda:0')
torch.rand(n, m)은 n x m 의 행렬의 원소를 [0, 1) 범위의 균등분포를 가지는 랜덤값으로 설정한다. 이와 관련해. torch.randn 함수는 평균 0, 표준편차 1의 정규분포에서 난수를 생성한다. torch.randint는 지정된 정수 범위에서 난수를 생성한다.
5. torch.tensor()
torch.tensor()함수는 데이터를 tensor로 변환한다. list, numpy 배열 등을 tensor로 변환할 수 있으며 torch.FloatTensor(), torch.LongTensor()와 같이 구체적으로 tensor 타입을 정의할 수도 있다.
import torch
import numpy as np
list = [13, 4, 2]
array = np.array([4, 5, 7, 12])
print(torch.tensor(list))
print(torch.FloatTensor(array).to("cuda"))
tensor([13, 4, 2])
tensor([ 4., 5., 7., 12.], device='cuda:0')
6. Tensor의 크기, 타입, 연산
.size 함수로 tensor의 크기를 확인할 수 있으며, type()함수로 타입이 torch.Tensor임을 확인할 수 있음은 물론 사칙연산/제곱/몫 계산 등의 기본 연산은 numpy와 동일하다.
import torch
import numpy as np
x = torch.rand(3, 3)
y = torch.rand(3, 3)
print(x.size())
print(x.size()[1])
print(y.size(1))
print(type(x))
torch.Size([3, 3])
3
3
<class 'torch.Tensor'>
.size()[dim]은 dim 차원의 크기를 가져온다. 1은 두번째 차원, 열이므로 열의 크기인 3을 반환한다. size(dim)으로도 사용할 수 있다.
import torch
import numpy as np
x = torch.rand(3, 3)
y = torch.rand(3, 3)
print(x + y)
print(torch.add(x, y))
print(y.add(x))
tensor([[1.0722, 1.0063, 1.9125],
[0.5597, 1.7185, 1.2472],
[0.8437, 1.5839, 1.0645]])
tensor([[1.0722, 1.0063, 1.9125],
[0.5597, 1.7185, 1.2472],
[0.8437, 1.5839, 1.0645]])
tensor([[1.0722, 1.0063, 1.9125],
[0.5597, 1.7185, 1.2472],
[0.8437, 1.5839, 1.0645]])
모두 동일한 x + y 연산을 수행한다. add_()함수를 이용하면 기존의 값을 덮어씌운다.
import torch
import numpy as np
x = torch.rand(3, 3)
y = torch.rand(3, 3)
print(x)
print(y)
y.add_(x)
print(y)
tensor([[0.5672, 0.7744, 0.9598],
[0.1449, 0.7259, 0.4160],
[0.7500, 0.5908, 0.3687]])
tensor([[0.4191, 0.8281, 0.6038],
[0.3862, 0.7496, 0.6033],
[0.3855, 0.1117, 0.6569]])
tensor([[0.9862, 1.6025, 1.5637],
[0.5311, 1.4756, 1.0193],
[1.1355, 0.7025, 1.0257]])
7. Tensor 크기 변환
import torch
import numpy as np
x = torch.rand(8, 8)
print(x.size())
a = x.view(64)
print(a.size())
b = x.view(-1, 4, 4)
print(b.size())
torch.Size([8, 8])
torch.Size([64])
torch.Size([4, 4, 4])
view 함수는 tensor의 모양을 변경하지만 데이터는 변경하지 않는다. view(row)는 새로운 텐서의 행의 수를 row로 설정하고, colum은 자동으로 계산된다. -1을 사용하면 해당 차원의 크기를 자동으로 계산한다.
8. Tensor을 numpy 배열로 변환
import torch
import numpy as np
x = torch.rand(8, 8)
y = x.numpy()
print(type(y))
<class 'numpy.ndarray'>
9. 단일 Tensor의 값 반환
import torch
import numpy as np
x = torch.ones(1)
print(x.item())
1.0
item()은 손실 함수값과 같이 숫자가 하나인 tensor의 값을 추출한다. item()함수는 반드시 하나의 요소만 포함된 tensor에서 호출해야 한다.
'PyTorch' 카테고리의 다른 글
[PyTorch] 데이터 로드 및 전처리 기본 (1) | 2025.01.13 |
---|---|
[PyTorch] Linear Regression(선형 회귀) - Autograd (0) | 2025.01.12 |
[PyTorch] Back Propagation(역전파) - Gradient Tensor (0) | 2025.01.11 |
[PyTorch] Pytorch 설치 (0) | 2025.01.09 |
[PyTorch] CUDA, cuDNN 설치 (0) | 2025.01.09 |