본문 바로가기

Machine Learning Models/Pytorch

Pytorch - gather

반응형

이번 포스트에서는 Pytorch gather 함수를 알아보도록 하겠습니다. gather 함수는 scatter 함수와 정반대로 동작하는 함수로 주어진 "input" 텐서에서 "dim", "index" 에 맞게 값을 모아주는 역할을 합니다.

torch.gather(input, dim, index, *, sparse_grad=False, out=None) → Tensor

gather 함수는 "input" 텐서에서 "dim", "index" 에 해당하는 요소값으로 새로운 텐서를 구성합니다. 3차원 텐서에 대해서 다음과 같이 동작합니다. scatter 함수와 반대 동작인 것을 알 수 있습니다.

out[i][j][k] = input[index[i][j][k]][j][k]  # if dim == 0
out[i][j][k] = input[i][index[i][j][k]][k]  # if dim == 1
out[i][j][k] = input[i][j][index[i][j][k]]  # if dim == 2

정의된 파라미터는 다음과 같습니다.

  • input (Tensor): 입력 텐서
  • dim (int): 입력 텐서의 기준 축
  • index (LongTensor): 입력 텐서를 모아줄 인덱스로 구성된 텐서로 정수형 텐서이어야 합니다.
  • out(Tensor, optional): gather 함수를 담을 텐서로 따로 선언할 경우 in-place 함수로 동작합니다.

Example

다음 예를 통해 동작을 확인해 보겠습니다.

t = torch.tensor([[1, 2], [3, 4]])
torch.gather(t, 1, torch.tensor([[0, 0], [1, 0]]))
# tensor([[ 1,  1],
#         [ 4,  3]])

scatter 함수와 마찬가지로 "index" 에 주어진 텐서 기준으로 동작합니다. 특히, "index" 텐서의 구성요소 별로 새로운 텐서 "out" 을 구성하다보니 "out" 텐서와 "index" 텐서는 크기가 같습니다.

  • out[0][0] 에는 t[0][index[0][0]] = t[0][0] = 1 이 대입됩니다.
  • out[0][1] 에는 t[0][index[0][1]] = t[0][0] = 1 이 대입됩니다.
  • out[1][0] 에는 t[1][index[1][0]] = t[1][1] = 4 가 대입됩니다.
  • out[1][1] 에는 t[1][index[1][1]] = t[1][0] = 3 이 대입됩니다.

"input" 과 "index" 는 같은 차원을 가져야 하며 차원 $d\neq dim$에 대해 $index.size(d)\leq input.size(d)$를 만족해야 합니다. ("dim" 이 아닌 차원에 대해 "index" 에 해당하는 행,열이 "input" 에도 존재해야 하기 때문입니다.) 또한, "out" 아규먼트에 어떠한 크기의 텐서를 넣어도 gather 함수의 결과가 할당됩니다. ("index" 와 같은 크기일 필요가 없습니다.)

 

참조

 


Pytorch - scatter

반응형

'Machine Learning Models > Pytorch' 카테고리의 다른 글

Pytorch - embedding  (0) 2021.06.23
Pytorch - autograd 정의  (1) 2021.06.02
Pytorch - scatter  (3) 2021.06.01
Pytorch - backward(retain_graph=True) (1)  (4) 2021.05.09
Pytorch - hook  (5) 2021.05.09