
Pytorch Study를 본격적으로 시작해볼려고 한다. 일단 시작은 가짜연구소 에서 올라온 Pytorch 가이드를 보면서 시작할려고 한다. 기초부, 이론부, 적용부, 활용부 이렇게 나뉘어져 있을 것을 보아 천천히 시작해보면 도움이 될 것이라고 생각된다. 내 Velog에는 내용을 그대로 갖다 적기 보다는 정리 노트 처럼 쓰일 예정이다.
Pytorch 에서는 기본적으로 아래 4개의 변수 구조가 있다.
모두 수학에서 나오는 개념과 동일하다. 4개의 큰 차이는 차원이 다르다는 점이다. 스칼라는 상수 인 만큼 따로 차원이 없고, 벡터는 1차원, 행렬은 2차원, 텐서는 3차원 혹은 그 이상으로 이루어져 있다.
그 중에서 텐서가 가장 벡터, 행렬을 닮아 유사하게 할 수 있으며 모델의 입·출력을 담당하게 된다.
import torch 1d_tensor = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9])
위 와 같은 방법으로 하면 1차원의 텐서가 생기게 된다. 벡터와 굉장히 유사하다. 1d_tensor 는 1, 2, 3, 4, 5, 6, 7, 8, 9 로 이루어져 있는 1차원 텐서인 셈이다. 2차원 텐서도 위와 같이 하면 된다.
import torch 2d_tensor = torch.tensor([ [1., 2., 3.,], [4., 5., 6.,], [7., 8., 9.,] ])
이렇게 구성된 텐서의 차원을 확인 할 수도 있다.
print(2d_tensor.dim())
dim() Method를 통해서 확인이 가능하다. 2d_tensor는 2차원으로 구성했기 때문에 2가 반환될 것이다. Tensor의 형태를 확인할 때에도 유사한 방법으로 쓰이게 된다. Numpy를 자주 써본 사람이라면 알겠지만 shape() Method로 크기가 확인이 가능하다. Pytorch도 유사하다.
print(2d_tensor.size()) print(2d_tensor.shape())
size(), shape() 두 Method 활용할 수 있다.
이렇게 텐서를 정해줄 수도 있지만 텐서의 크기에 따라서도 내가 직접 정할 수도 있다.
텐서의 shape를 Tuple로 선언하여 그 크기에 맞는 Tensor 를 만들수 있다.
shape = (2, 3,) random_tensor = torch.randn(shape) ones___tensor = torch.ones(shape) zeros__tensor = torch.zeros(shape)
2행 3열 크기의 텐서를 만들게 된다. 3개의 함수를 통해서 만들수 있다. torch.randn() 는 random integer 의 약자로 랜덤한 인자를 2행 3열 크기의 텐서로 만든다. torch.ones() 는 텐서의 인자를 모두 1로 채우는 함수이다. torch.zeros() 는 텐서의 인자를 모두 0으로 채우는 함수이다.
사실 실제 개발을 하게 되면 List, dictionary 형태로 저장을 하게 된다. 그렇기 때문에 텐서로 변환을 어떻게 해주냐가 중요하다. 어렵진 않다. 위에 있던 내용을 그대로 하면 된다.
import torch list_X = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] tensor_X = torch.tensor(list_X)
list_X 를 원본 데이터라고 가정을 하자. 뭐, 대부분 list 형태가 많이 쓰이기 때문에 위와 같은 예시를 해보았다. 그리고 그대로 텐서로 넣어주면 된다.
print("Dimension : ", tensor_X.dim()) print("Size : ", tensor_X.size())
Dimension : 1
Size : torch.Size([10])
차원은 1차원이고, 사이즈는 10이다. list_X가 List가 하나로 되어 있고 길이는 10개로 되어 있다. 그렇기에 1차원, 10 사이즈가 나오는 것이다. 만약에
list_X = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] tensor_X = torch.tensor(list_X)
이렇게 되면 2차원이 된다. 크기는 3 x 3 와 같은 형태로 되어 있다. 하지만 주의 해야할 것이 있다.
list_X = [[1, 2, 3],
[4, 5, 6, 7],
[8, 9, 0]]
위와 같은 형태가 되어 있다면 텐서의 크기가 다 맞지가 않기 때문에 변환이 안된다. Numpy 에서도 이를 array 로 바꿀수가 없다. 그렇기에 Numpy 에서 dtype=object 으로 해줘야 올바르게 할 수 있다.