본문 바로가기
Deep Learning

[Pytorch]Pytorch Basic

by Yonghip 2023. 3. 19.

파이토치 모델을 가져와봐서 사용해 본 적은 몇 번 있지만 기초부터 배워보는 건 이번이 처음이다

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부분은 확실한 이해가 안 된다.

다음 글에 관련 내용을 모두 때려 박아 정리해 보겠다.