반응형
PyTorch Basics
Tensor
- 다차원 Arrays를 표현하는 Pytorch 클래스
- 사실상 numpy의 ndarray와 동일(Tensorflow의 Tensor와도 동일)
- Tensor를 생성하는 함수도 거의 동일
- numpy는 ndarray라는 객체를 사용하고 pytorch에서는 tensor라는 객체를 사용
example
#numpy - ndarray
import numpy as np
n_array = np.arange(10).reshape(2,5)
print(n_array)
print("n_dim:",n_array.ndim, "shape: ",n_array.shape)
->
[[0 1 2 3 4]
[5 6 7 8 9]]
n_dim: 2 shape: (2, 5)
------------------------------------------------------------------------
#pytorch - tensor
import torch
t_array = torch.FloatTensor(n_array)
print(t_array)
print("n_dim:",t_array.ndim, "shape: ",t_array.shape)
->
tensor([[0., 1., 2., 3., 4.],
[5., 6., 7., 8., 9.]])
n_dim: 2 shape: torch.Size([2, 5])
------------------------------------------------------------------------
#list to tensor
data = [[3,5],[1,2]]
x_data = torch.tensor(data)
numpy like operations
numpy에서 사용되는 함수의 사용법이 그대로 적용됨
data = [[1,2,3],[4,5,6],[7,8,9]]
x_data = torch.tensor(data)
x_data
->
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
x_data[1:]
->
tensor([[4, 5, 6],
[7, 8, 9]])
x_data[:2, 1:]
->
tensor([[2, 3],
[5, 6]])
x_data.flatten()
->
tensor([1, 2, 3, 4, 5, 6, 7, 8, 9])
torch.ones_like(x_data)
->
tensor([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
x_data.numpy()
->
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
x_data.shape
->
torch.Size([3, 3])
x_data.dtype
->
torch.int64
cuda에 올려서 연산을 하기위한 방법
if torch.cuda.is_available():
x_data_cuda = x_data.to('cuda')
x_data_cuda.device
device(type='cuda', index=0)
Tensor Handling
- view: reshape과 동일하게 tensor의 shape을 변환
- squeeze: 차원의 개수가 1인 차원을 삭제 (압축)
- unsqueeze: 차원의 개수가 1인 차원을 추가
- view
- view와 reshape은 거의 동일하다.
- 웬만하면 view를 사용하자
tensor_ex = torch.rand(size=(2,3,2))
tensor_ex
->
tensor([[[0.6008, 0.4170],
[0.6324, 0.2487],
[0.5814, 0.3267]],
[[0.2024, 0.1253],
[0.4627, 0.3233],
[0.3359, 0.1641]]])
tensor_ex.view([-1,6])
->
tensor([[0.6008, 0.4170, 0.6324, 0.2487, 0.5814, 0.3267],
[0.2024, 0.1253, 0.4627, 0.3233, 0.3359, 0.1641]])
tensor_ex.reshape([-1,6])
->
tensor([[0.6008, 0.4170, 0.6324, 0.2487, 0.5814, 0.3267],
[0.2024, 0.1253, 0.4627, 0.3233, 0.3359, 0.1641]])
- squeeze, unsqueeze
#squeeze
torch_ex = torch.rand(size=(2,1,2))
torch_ex
->
tensor([[[0.0123, 0.6432]],
[[0.6226, 0.2209]]])
torch_ex.squeeze()
->
tensor([[0.0123, 0.6432],
[0.6226, 0.2209]])
#unsqueeze
torch_ex = torch.rand(size=(2,2))
torch_ex
->
tensor([[0.2248, 0.1194],
[0.7607, 0.8910]])
torch_ex.unsqueeze(0).shape
->
torch.Size([1, 2, 2])
torch_ex.unsqueeze(1).shape
->
torch.Size([2, 1 2])
torch_ex.unsqueeze(2).shape
->
torch.Size([2, 2, 1])
matmul, mm, dot
matmul은 broadcasting이 된다.
matmul보다는 mm을 써라
mm은 벡터간 연산을 지원하지 않지만 dot은 지원한다.
a = torch.rand(10).view(2,5)
b = torch.rand(10).view(5,2)
a.mm(b)
->
tensor([[1.4286, 1.4668],
[1.2437, 1.1330]])
a.matmul(b)
tensor([[1.4286, 1.4668],
[1.2437, 1.1330]])
Tensor operations for ML/DL formula
nn.functional 모듈을 통해 다양한 수식 변환을 지원함
import torch.nn.functional as F
F.softmax(tensor, dim=0)
반응형