파이토치 모델을 가져와봐서 사용해 본 적은 몇 번 있지만 기초부터 배워보는 건 이번이 처음이다
ndarray, Tensorflow의 tensor와 다른 점 혹은 처음 보는 개념만 짚고 설명해 보겠다
Tensor
다차원 Array를 표현하는 Pytorch의 클래스이며 numpy의 ndarray, Tensorflow의 Tensor와 유사함
즉 ndarray에서 사용가능한 attribute를 대부분 이름 그대로 사용가능하다
a = torch.tensor([[1,2,3], [4,5,6]])
print(a.ndim, a.shape)
2 torch.Size([2, 3])
텐서플로우의 텐서 혹은 ndarray와 차이점은 GPU에 올려두고 사용할 수 있다는 점
print(a.device)
if torch.cuda.is_available():
a = a.to("cuda")
print(a.device)
device(type='cpu')#Tensor생성시 기본으로 cpu에 할당된다
device(type='cuda', index=0)
view, reshape
view와 reshape는 Tensor차원을 변경하는 동일한 역할을 하지만 동작에서 약간의 차이가 존재한다(이 블로그에 자세히 정리되어 있다.)
간단히 말하자면 view는 데이터의 순서와 메모리의 순서가 일치해야만 사용가능하다
하지만 reshape는 순서가 일치하지 않을 시 그냥 값을 가져와 새로운 메모리에 재할당한다.
a = torch.tensor([[1,2,3], [4,5,6]])
b = a.T.view(6)
# a.fill_(1)
a = torch.tensor([[1,2,3], [4,5,6]])
b = a.T.reshape(6)
a.fill_(1)
print(a)
print(b)
RuntimeError Traceback (most recent call last)
Cell In[86], line 2
1 a = torch.tensor([[1,2,3], [4,5,6]])
----> 2 b = a.T.view(6)
3 # a.fill_(1)
RuntimeError: view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.
tensor([[1, 1, 1],
[1, 1, 1]])
tensor([1, 4, 2, 5, 3, 6])
보다시피 view사용 시 메모리순서가 꼬이는 연산(주로.T연산인듯)후 사용이 불가능하다
하지만 reshape는 사용이 가능하며 a.fill_(1) 결과가 영향을 주지 않음을 보아 다른 메모리를 참고하는걸 확인가능하다.
a = torch.tensor([[1,2,3], [4,5,6]])
b = a.reshape(6)
a.fill_(1)
print(b)
tensor([1, 1, 1, 1, 1, 1])
실제로 transpose연산을 사용하지 않고 reshape사용 시에는 값이 변경되는 걸 알 수 있다.
활용면으로 보면 무지성으로 view를 사용하는 게 메모리자원면에서 이득이라고 생각한다.
view가 안 먹히는 경우 순서 꼬였네~ 정도로 생각하고 중요치 않다면 그때 reshape를 사용하면 될듯하다
squeeze, unsqueeze
squeeze를 통해 원소가 1개인 차원 제거, unsqueeze를 통해 차원 추가
a = a.reshape(2, 1, 3)
print(a.squeeze().shape)
print(a.unsqueeze(0).shape)
print(a.unsqueeze(-1).shape)
torch.Size([2, 3])
torch.Size([1, 2, 1, 3])
torch.Size([2, 1, 3, 1])
Appendix
행렬연산은 dot이 아닌 mm을 사용해야 한다.
matmul역시 사용가능한데 이경우 부족한 차원을 broadcasting 해줌(연산 결과를 확신하기 어려워 사용 시 주의)
초반 Torch자료형 학습은 별로 어렵지 않았지만 아직까지도 backward부분은 확실한 이해가 안 된다.
다음 글에 관련 내용을 모두 때려 박아 정리해 보겠다.
'Deep Learning' 카테고리의 다른 글
[Langchain] FAISS에서 cosine similarity 사용하기 (0) | 2024.11.25 |
---|---|
[Pytorch] ImageFolder label기준으로 split하기 (0) | 2023.04.10 |
[Pytorch]Datasets and dataloaders (0) | 2023.03.23 |
[Pytorch]Autograd (0) | 2023.03.19 |