ML/PyTorch

1. 텐서

Min Potato 2023. 2. 24. 16:38

텐서

 

- 파이토치의 기본 단위, GPU 연산을 가능하게 함.

- 또한 Numpy의 배열과 유사하여 Numpy를 공부한 사람이라면 손쉽게 다룰 수 있음.

 

1. empty, ones, empty, zeros

import torch
import numpy as np

x = torch.empty(5,4)
print(x)
tensor([[1.8515e+28, 1.7744e+28, 5.3831e-14, 1.8037e+28],
        [6.7120e+22, 2.8231e+23, 7.1377e+31, 5.3740e+19],
        [1.8888e+31, 1.9011e-19, 1.2711e+31, 4.2321e+21],
        [4.5581e+30, 1.1725e-19, 5.0746e+31, 7.5338e+28],
        [2.8884e+12, 7.5338e+28, 1.5769e-19, 1.9432e-19]])

- 위 코드는 torch.empty()를 통해 크기가 5x4인 빈 텐서를 생성하였으며, 아직 초기화되지 않은 행렬인 경우 해당 시점에 할당된 메모리에 존재하던 값들이 초기값으로 나타난다.

- torch는 ones, zeros, empty등 넘파이에서 사용되는 동일한 형태의 함수들을 가지고 있다.

- torch.rand()는 원하는 크기의 랜덤행렬을 생성해 준다.

2. tensor()

- 기존의 리스트나 넘파이 배열도 torch.tensor()를 통해 텐서로 변환이 가능하다.

- 또한 torch.FloatTensor(), torch.LongTensor()와 같이 구체적인 텐서 타입을 정의할 수 있다.

import numpy as np
i = [3,4]
r = np.array([1,23,4])
torch.tensor(i)
OutPut:
tensor([3, 4])
torch.tensor(r)
OutPut:
tensor([1,23, 4])

 

3. size(), 타입, 연산 

- .size()는 텐서의 크기를 확인할 수 있으며 매우 자주 사용된다.

i.size()

Output:
torch.Size([3])

- 만약 5x4크기의 텐서에서 열의 크기만 가져 오고 싶다면 다음과 같이 하면 된다. (행은 0으로 하면 되겠지?)

x = torch.ones(5,4)
x.size(1)
x.size()[1]

- 그리고 텐서의 타입은 torch.Tensor 다.

type(x)

Output:
torch.Tensor

- 텐서의 사칙 연산, 제곱, 몫 계산 등의 기본 연산은 넘파이와 동일하다.

x = torch.rand(2,2)
y = torch.rand(2,2)
print(x)
print(y)

x+y
#or
torch.add(x,y)
#or 
y.add(x) # y에 x를 더한다는 의미

Output: 
tensor([[0.7570, 0.3729],
        [0.5496, 0.9795]])
tensor([[0.4568, 0.1612],
        [0.5283, 0.3834]])
tensor([[1.2138, 0.5341],
        [1.0779, 1.3628]])

- y.add()는 y에 x를 더하여 y를 갱신한다. 즉, y는 기존 y와 x가 더해진 값으로 바뀌었다.

- 이와 같이 기존의 값을 덮어 씌우는 방식을 인플레이스 방식이라고한다. 

4. 텐서의 크기 변환

- numpy에서 크기 변환 했던 것과 동일하다.

- 텐서에서는 크기 변환을 위해 view()라는 함수를 사용한다.

x = torch.rand(8,8)
print(x.size())
a = x.view(64)
print(a.size())
b = x.view(-1,4,4)
print(b.size())

Output:
torch.Size([8, 8])
torch.Size([64])
torch.Size([4, 4, 4])

- '-1'은 알지?

- 원래 크기가 되게 하는 값으로 , 전체 성분이 64개가 되게 하는 4x4x4 배열을 만들어야 한다. 즉, -1이 위치한 곳은 4로 자동 할당된다.

 

5. item()

- item()은 손실 함숫값과 같이 숫자가 하나인 텐서를 텐서가 아닌 값으로 만들어 준다. 

item = torch.rand(1)
print(item.item())

Output:
0.6891871094703674