꺼내먹는지식 준

Torch Tensors 본문

AI/PyTorch

Torch Tensors

알 수 없는 사용자 2022. 1. 25. 19:21

Torch.is_tensor( x ) $\rightarrow$ Boolean

x 가 tensor 인지 확인 후, Boolean Return 

 

torch.numel(x)

element 개수 Return  # len(x) 는 차워에 따라 값이 바뀌므로 사용할 수 없다. 

 

https://pytorch.org/docs/stable/torch.html#tensors

Torch.Tensor는 다음의 세부 항목으로 분류 된다. 

- "Creation Ops"
- "Indexing, Slicing, Joining, Mutating Ops"

1) Creation Ops

: Tensors"라는 자료구조를 만드는 함수들

대표 예제 3가지 

  • from_numpy
  • zeros
  • zeros_like
import torch
import numpy as np

# 🦆 torch.from_numpy
a = np.array([1,2,3])
t = torch.from_numpy(a)
#tensor([1, 2, 3])

numpy $\rightarrow$ tensor 

torch.zeros(2, 3)
#tensor([[0., 0., 0.],
        [0., 0., 0.]])

0을 원소로 갖는 (size) 크기의 tensor 생성 

torch.zeros_like(t)
#tensor([0, 0, 0])
torch.zeros_like(torch.tensor([1,2,3]))
#tensor([0, 0, 0])

해당하는 tensor 와 동일 한 크기, element는 0으로 대체 

해당 tensor의 값을 바꾸지는 않고 return 

 

2)Indexing, Slicing, Joining, Mutating Ops

: 이름과 같이 indexing, slicing, joining 등 너무 중요한 함수가 많이 들어있다. 

이 중, 

  • chunk
  • swapdims
  • zeros_like

3개만 둘러보고, 나머지는 상단에 첨부 된 document 를 참고하여 공부하자. 

torch.chunk(input, chunks, dim=0) → List of Tensors
import torch
import numpy as np

t = torch.tensor([[1, 2, 3],
                  [4, 5, 6]])

print(torch.chunk(t, 2, 0))
print(torch.chunk(t, 2, 1))

#(tensor([[1, 2, 3]]), tensor([[4, 5, 6]]))
#(tensor([[1, 2], [4, 5]]), tensor([[3], [6]]))

Attempts to split a tensor into the specified number of chunks. Each chunk is a view of the input tensor.

 

t에 대하여 dim = 0  2개로 나누어라. 

0차원 [[1,2,3], [4,5,6]] 을 두개로 쪼개면 

똑같이 tensor([ [1,2,3] ]), tensor( [4,5,6] )

t에 대하여 dim = 1 chunk 2개 만들어라. 

1차원 [1,2,3],  [4,5,6] 을 두개로 쪼개면 총 4개가 되어야 하나 개수가 맞지 않아서 다음과 같이 쪼개졌다. 

tensor([[1,2] , [4,5]] ), tensor ( [[3] , [6]] ) 

 

torch.swapdims(input, dim0, dim1) → Tensor

x = torch.tensor([[[0,1],[2,3]],[[4,5],[6,7]]])
x.shape
# ([2,2,2])
torch.swapdims(x, 0, 1)
#tensor([[[0, 1],
         [4, 5]],
        [[2, 3],
         [6, 7]]])
torch.swapdims(x, 0, 2)
#tensor([[[0, 4],
         [2, 6]],
        [[1, 5],
         [3, 7]]])

Transpose

Tensor.scatter_(dim, index, src, reduce=None) → Tensor

src = torch.arange(1, 11).reshape((2, 5))
#tensor([[ 1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10]])
    
    
src = torch.arange(1, 11).reshape((2, 5))
# [[[1,2,3,4,5], [6,7,8,9,10]]]


index = torch.tensor([[0,1,2,0]])


#tensor[index[i][j]][j] = src[i][j]
0차원 이니까,
index[0][0] = 0
index[0][1] = 1
index[0][2] = 2
index[0][3] = 0


#tensor[0][0] = 1
tensor[1][1] = 2
tensor[2][2] = 3
tensor[0][3] = 4

tensor[i][index[i][j]] = src[i][j]


#tensor([[1,0,0,4,0],
[0,2,0,0,0],
[0,0,3,0,0]
])

https://hongl.tistory.com/201

 

Pytorch - scatter

Pytorch 에는 새롭게 구성한 텐서에 원하는 인덱스에 맞게 값을 할당해주는 scatter 함수가 존재합니다. (Tensorflow 에도 존재합니다.) 이번 포스트에서는 scatter 함수의 동작원리에 대해 알아보도록 하

hongl.tistory.com

 

이렇게 이해하면 좋다. 

index = 0 

[[0,1,2,3]]

(0,0) = 0 

(0,1) = 1

(0,2) = 2

(0,3) = 3

 

즉 

tensor 의 index 0 자리에 

tensor[0 ~ 3][0] = src[0][0] ((0,0) 이므로)

tensor[0 ~ 3][1] = src[0][0] ((0,1) 이므로)

tensor[0 ~ 3][2] = src[0][0] ((0,2) 이므로)

tensor[0 ~ 3][3] = src[0][0] ((0,3) 이므로)

 

3) Random Sampling

랜덤 초기화 

실험 결과를 재구현 할 때, 개선이 되는지 정확히 비교하기 위해서는 동일한 Random Number를 사용해야 할 때가 있다. 

3개정도만 살펴보자. 

  • seed
  • manaul_seed
  • initial_seed
print(torch.rand(5))
print(torch.seed())
print(torch.rand(5))

#tensor([0.0478, 0.0481, 0.1961, 0.9876, 0.9322])
#14118695014337129577
#tensor([0.5923, 0.1255, 0.1994, 0.7639, 0.7828])

torch.seed() 함수에서 return 된 값을 torch.manual_seed 의 인자 값으로 사용해보자. 

torch.manual_seed(14118695014337129577)
print(torch.rand(5))

#tensor([0.5923, 0.1255, 0.1994, 0.7639, 0.7828])

다음과 같이 같은 seed 일 때, 동일한 random 값이 생성되는 것을 볼 수 있다. 

torch.manual_seed(1)
print(torch.rand(5))
torch.manual_seed(1)
print(torch.rand(5))
print(torch.initial_seed())
print(torch.rand(5))

#tensor([0.7576, 0.2793, 0.4031, 0.7347, 0.0293])
#tensor([0.7576, 0.2793, 0.4031, 0.7347, 0.0293])
#1
#tensor([0.7999, 0.3971, 0.7544, 0.5695, 0.4388])

manual_seed 값만 동일하면 같은 난수를 생성한다. 

한번 고정하면 다음번 출력까지만 지속 된다. 

또한, initial_seed 함수로 첫번째 시드값을 return 받을 수 있다. 

 

'AI > PyTorch' 카테고리의 다른 글

Pytorch nn.Module 총정리 / 모델 만드는 법  (0) 2022.01.25
Torch Math Operations  (0) 2022.01.25
Torch Indexing  (0) 2022.01.25
Pytorch Dataset  (0) 2022.01.25
Pytorch Backpropagation(AutoGrad, Optimizer)  (0) 2022.01.25
Comments