1. 텐서
텐서
- 파이토치의 기본 단위, 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