[PyTorch] einsum / einops

이승수·2024년 10월 23일

1. einsum

특정 index의 집합에 대한 합(시그마)연산을 간결하게 표시하는 방법
행렬, 벡터의 내적, 외적, 전치, 행렬곱 표현

A = tensor([[1,2],
			[3,4]])
            
# Transpose
torch.einsum("ij->ji", A)
[[1,3],
[2,4]]

# Sum
torch.einsum("ij->",A)
10

torch.einsum("ij->i",A)
[3,7]

torch.einsum("ij->j",A)
[4,6]

Matrix Multiplication

A = tensor([0,1,2])
B = tensor([0,1,2])

# Dot Product
torch.einsum("ii->",A,B)
→ tensor(5)

# Outer Product
torch.einsum("i,j->i,j",A,B)
→ tensor([[0, 0, 0],
           [0, 1, 2],
           [0, 2, 4]])

# Hadamard Product
A = torch.tensor([[0,1,2],[3,4,5]])
B = torch.tensor([[0,1,2],[3,4,5]])

torch.einsum("ij,ij->ij",A,B)
→ tensor([0, 1, 4],
          [9, 16, 25]])

2. einops

효율적인 tensor 차원 관리 라이브러리

from einops import rearrange, reduce, repeat

rearrange : 차원 재배열 method

  • 3차원 이미지 (224, 124, 3)가 있다면 표현식으로 차원 순서를 재배열 할 수 있다

    rearrange(images, 'h w c -> c h w')
    → (3, 224, 124)

  • 4차원의 이미지 (3, 224, 124, 3)가 있다면 이를 ()를 활용하여서 차원끼리 묶어 줄 수 있다 , 'b h w c ->(h b) w c'

    rearrange(images, 'b h w c ->(h b) w c')
    → (672, 124, 3)

  • 임시 값을 활용하여서 정렬해줄 수도 있다

    rearrange(images, 'b (h1 h) (w1 w) c -> (b h1 w1) h w c', h1=2, w1=2)
    → (12, 62, 112, 3)

reduce : 배열에 대한 축소 연산

  • 4차원의 이미지 (3, 224, 224, 3)으로 구성된 이미지가 있다면
    4장의 이미지가 하나의 배열로 있는것

    reduce를 활용하여하나의 이미지로 축소할 수 있다
    reduce(images, 'b h w c -> h w c', 'mean')

repeat : 배열에 대한 복제 연산

  • 3차원의 이미지 (224, 224, 3) 이 있다면 아래와 같이 repeat를 활용해 반복연산 가능

    repeat(img[0], 'h w c -> h (repeat w) c', repeat=3)
    repeat(img[0], 'h w c -> h (3 w) c')
    해당 경우 가로로 3번 반복된다

profile
AI/Data Science

0개의 댓글