728x90

우선 매서드 설명은 0이나 1로만 이루어져 있는 지정하는 shape만큼의 벡터를 생성한다.

 

들면 torch.ones(2,3)실행 tensor([[1., 1., 1.],[1., 1., 1.]])로 받는다.

Zeros또한 사용법은 같지만 output 0으로만 이루어져있는 행렬 tensor 반환된다.

torch.ones(2,3)

#output tensor([[1., 1., 1.],[1., 1., 1.]])

 

여기서 친절하게 data shape 유동적인 변환이 있을 경우를 위해 사용되는 likes매서드도 있다.

 

같은 행렬의 shape 만들어지는데 예시 사용법은 다음과 같다.

X = torch.tensor([[2,3,4],[3,3,1]])
print(torch.ones_like(X))


# output tensor([[1, 1, 1], [1, 1, 1]])

그럼 다음과 같은 매서드는 언제 쓰이나?

초기 딥러닝을 배울 RNN이라던지 CNN이라던지에 대해선 거의 활용도를 모를 가능성이 있다. 그래봤자 벡터의 크기가 다른 만큼을 padding하는 과정? 하지만 더더욱 직관적으로 쓰이는 모델이 있다.

 

BERT의 어텐션 마스크이다.

아직은 깊게 다루진 않으므로 가볍게 설명하자면

어텐션 마스크란 0 값을 가지는 패딩토큰으로 연산의 효율성을 위해 단어와 토큰을 구분할 있게 한다.

 

소결로는 입력 text데이터 길이 만큼 0으로 이루어져 있는 벡터와 1 이루어져 있는 벡터를 만들어야 한다는 뜻이다.

print(inputs['input_ids'])
tf.Tensor([[ 101 4715 2003 1037 2428 4569 103 1012 102]], shape=(1, 9), dtype=int32)

print(inputs['token_type_ids'])
tf.Tensor([[0 0 0 0 0 0 0 0 0]], shape=(1, 9), dtype=int32)

print(inputs['attention_mask'])
tf.Tensor([[1 1 1 1 1 1 1 1 1]], shape=(1, 9), dtype=int32)

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

Pytorch - Indexing(2)  (0) 2022.09.28
Pytorch - Indexing(1)  (0) 2022.09.27
728x90

대각행렬 추출하기 (gather와 expand를 활용하여)

개인적으로 gather를 이해할 때 조금 CNN 컨볼루젼 커널을 생각하면 코딩을 하면 편하다고 생각한다.

! 본 글은 axis=1의 관점으로만 해석했기 때문에 gather를 이해하기에 최적화된 방법은 아닙니다.

  • 2D tensor 대각선 요소

앞서 봤던 axis개념으로 접근을 하고 gather를 이해하려면 세로를 차례대로 가로의 indecies의 요소들의 위치를 뽑는다.

따라서 예시에서 4와 -2를 뽑기 위해선 axis=1을 기준으로는 순차적으로 index = 0, index =1 번을 뽑아야 구현된다.

그리고 gather라는 매서드는 indecies를 tensor로 받아야하기 때문에 다음과 같은 코드로 구현할 수 있다.

import torch

A = torch.Tensor([[4, 5],[1, -2]])
output = A
output = torch.gather(output, 1, torch.tensor([[0],[1]]))
print(output)

Out으로 [[4],[-2]]가 나온다면 정상이다. 이의 형태를 바꾸기 위해선 view나 reshape 양식을 사용하면 된다.

그렇다면 3차원의 tensor일 때 어떻게 해야할까.

  • 3D tensor 대각선 요소

이번에도 axis=1을 기준으로 확인한다면 3x3이라면 indecies를 [0,1,2]로 지정해줘야한다.

근데 문제는 3D일때는 채널이라는 것이 존재하는데, axis=2라는 관점이 존재하기 때문이다. 3x3의 행렬이 여러개 겹쳐 있을 수 있다는 뜻이다. gather를 컨볼루션 연산의 커널로 연상하듯 채널도 이미지 데이터로 이해하면 편하다.

이미지 픽셀 데이터가 가로x세로로 존재하며 RGB값으로 3개의 데이터 값이 합쳐져야 이미지 하나의 데이터로 표현된다.

 

따라서 [0,1,2]의 벡터를 채널의 갯수만큼 늘려줘야하는데, 이 때 쓰는 매서드가 expand이다.

(expand는 추후에 제대로 설명을 다시 하겠다. 간단히만 설명하면 원하는 차원 크기로 텐서를 반복하여 생성한다.)

여기선 어떤 데이터에 따라 유동적으로 변하는 Function을 만들기 위해 axis = 0,1의 shape에 따라 [0], [0,1], [0,1,2]를 유동적으로 생성한 후, 채널의 갯수에 맞춰 유동적으로 expand를 사용하여 변환시켜준다.

import torch

def get_diag_element_3D(A):
    C, H, W = A.size()
    if H > 2 :
        H = 3
    tmp = [[[x for x in range(H)]]]
    indecies = torch.tensor(tmp).expand(C,-1,H)    
    output = A
    output = torch.gather(output, 1, indecies)
    output = output.squeeze()
    return output

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

Pytorch - Ones와 Zeros  (0) 2022.09.29
Pytorch - Indexing(1)  (0) 2022.09.27
728x90
  • Torch.index_select indices 지정하여 행렬에 차원을 기준으로 원하는 값을 뽑을 있다.
  • 이것을 응용하여 행렬의 대각선에 잇는 원소들이나, 세로, 가로 축의 원소들만 뽑아올 있다.
  • Ex) [[1,2],[3,4]] 에서 1과 3 추출하고 싶으면 아래와 같다.
import torch
	
Matrix = torch.Tensor([[1, 2],
	                  [3, 4]])
	
indices = torch.tensor([0])
A = torch.index_select(A, 1, indices)
output = A.view(1,2)
	
print(output)

Out : tensor([[2., 4.]])
  • 코드의 이해를 위해 사진을 참고하면 axis 1 기준으로 0번째 원소만을 뽑는다.

 

  • 따라서 2 4 뽑기 위해선
indices = torch.tensor([1])
A = torch.index_select(A, 1, indices)

마지막으로 [1,2]  뽑기 위해선

indices = torch.tensor([0])
A = torch.index_select(A, 0, indices)

한번 실습으로 [3,4] 를 뽑아보는 연습을 해보는 것이 좋다.

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

Pytorch - Ones와 Zeros  (0) 2022.09.29
Pytorch - Indexing(2)  (0) 2022.09.28

+ Recent posts