코딩걸음마

[딥러닝] Pytorch 주요함수 expand/randperm/argmax/topk/masked_fill/Ones , Zeros 본문

딥러닝_Pytorch

[딥러닝] Pytorch 주요함수 expand/randperm/argmax/topk/masked_fill/Ones , Zeros

코딩걸음마 2022. 6. 24. 19:07
728x90

1. expand

expand는 Tensor를 복사하여 원하는 차원으로 만드는 방법이다.

import torch
x = torch.FloatTensor([[[1, 2]],
                       [[3, 4]]])
print(x.size())
torch.Size([2, 1, 2])

이 tensor를 복사하여 [2, 4, 2] 형태로 바꿔보자

y = x.expand(*[2, 4, 2])

print(y)
print(y.size())
tensor([[[1., 2.],
         [1., 2.],
         [1., 2.],
         [1., 2.]],

        [[3., 4.],
         [3., 4.],
         [3., 4.],
         [3., 4.]]])
torch.Size([2, 4, 2])

물론 cat을 활용해서 붙힐 수 있다.

y = torch.cat([x, x, x, x], dim=1)

print(y)
print(y.size())
tensor([[[1., 2.],
         [1., 2.],
         [1., 2.],
         [1., 2.]],

        [[3., 4.],
         [3., 4.],
         [3., 4.],
         [3., 4.]]])
torch.Size([2, 4, 2])

 

 

2. randperm

무작위 정수로 이루어진 수열을 가진 tensor를 생성하는 함수이다.

index_select 함수와 같이 활용하여 무작위추출, 셔플링을 하는데 활용할 수 있다

randperm(n) n안에 정수를 넣어서 사용한다. list나 다른 형태는 불가능

.

x = torch.randperm(15)
x
tensor([12, 14,  7,  8,  5,  9,  2, 10,  1,  3,  0,  4,  6, 13, 11])

 

 

3. argmax

argmax는 딥러닝 과정에서 자주 쓰이는 함수이다.

tensor 내 data 중 가장 높은 값을 가지는 index를 반환한다.

그러면 예시를 위해 randperm 함수를 활용하여 tensor를 선언해보자.

x = torch.randperm(2**3).reshape(2, 2, -1)

print(x)
print(x.size())
tensor([[[0, 7],
         [5, 1]],

        [[2, 6],
         [3, 4]]])
torch.Size([2, 2, 2])

argmax(dim=-1)은 마지막 차원 즉, 3차원에서 바라보았을 때(3차원의 경우 바라보는 기준은 끝값을 기준으로 바라본다)를 기준으로 최대값의 인덱스를 반환한다.

y = x.argmax(dim=-1)

print(y)
print(y.size())
tensor([[1, 0],
        [1, 1]])
torch.Size([2, 2])

처음 인덱스를 보면 당황스럽기 그지없다. 인덱스 값으로 나온값이 직관적으로 해석되지않기 때문이다.

argmax가 반환한 인덱스 [[1, 0],  [1, 1]] 은 바라보는 면(인덱스자체가 2x2) 기준으로 0번째인지 1번째인지 말해주는 뜻이다.

물론 말을 풀어써도 어렵다. 아래의 그림을 보자.

출처 : 작성자 제작

 

 

4. topk

x = torch.LongTensor([[[0, 7],
                      [5, 1]],

                      [[2, 6],
                      [3, 4]]])

values, indices = torch.topk(x, k=1, dim=0)

print(values.size())
print(indices.size())

topk는 파라미터로  tensor, k, dim을 받는

k는 몇 등까지 data를 가져올건지 정하는 파라미터이고,

dim은 몇차원을 기준으로 할것인지 정하는 파라미터이다.

그 후,  argmax처럼 index를 반환할 뿐만 아니라, values까지 출력한다.

indices
tensor([[[1, 0],
         [0, 1]]])
values
tensor([[[2, 7],
         [5, 4]]])

물론 argmax처럼 직관적인 해석이 불가능하다.

그림을 보고 이해해보자.

출처 : 작성자 제작

 

 

+ 정렬 sort (topk를 활용하여 구현해보자)

target_dim = 0
values, indices = torch.topk(x,
                             k=x.size(target_dim),
                             largest=True)

print(values)
tensor([[[7, 0],
         [5, 1]],

        [[6, 2],
         [4, 3]]])

 

 

5. masked_fill

pandas에서 특정조건을 가진 mask를 만들어 DataFrame에 대입하여 bool 형태의 값을 반환하는

mask가 있다. pytorch에도 이러는 mask기법이 있는데 이를 알아보자.

 

우선 간단한  FloatTensor를 만들어 보자.

x = torch.FloatTensor([i for i in range(3**2)]).reshape(3, -1)

print(x)
print(x.size())

 

tensor([[0., 1., 2.],
        [3., 4., 5.],
        [6., 7., 8.]])
torch.Size([3, 3])

mask 는 tensor에 조건을 준 값을 변수로 받는다.

mask = x > 4

print(mask)
tensor([[False, False, False],
        [False, False,  True],
        [ True,  True,  True]])

mask를 출력해보면 bool 형태의 dype을 가진 것을 확인할 수 있다. 

그렇다면 이 mask를 통해 data를 추출해보자

y = x.masked_fill(mask, value=-1)

print(y)

masked_fill(mask, value=-1)

mask에서 Ture인 위치의 값들은 value에 입력된 -1이 입력된다.

tensor([[ 0.,  1.,  2.],
        [ 3.,  4., -1.],
        [-1., -1., -1.]])

 

 

6. Ones , Zeros

numpy에도 비슷한 기능이 있다. 특정한 크기를 가졌지만 빈 array가 아닌 array를 만들때 사용한다.

방법은 numpy와 매우 유사한 방법이다.  (np.zeros)

print(torch.ones(2, 3))
print(torch.zeros(2, 3))
tensor([[1., 1., 1.],
        [1., 1., 1.]])
tensor([[0., 0., 0.],
        [0., 0., 0.]])

딥러닝 연산을 수행 할때 data들은 dtype과 사용하는 device(gpu or cpu)가 모두 같아야한다. 이때 앞서 사용된 dtype과 device를 계승하는 방식으로 값을 생성하는 방법은 아래와 같다.

print(torch.ones_like(x))
print(torch.zeros_like(x))
tensor([[1., 1., 1.],
        [1., 1., 1.]])
tensor([[0., 0., 0.],
        [0., 0., 0.]])
728x90
Comments