john8538 님의 블로그

텐서 연산 마스터하기: 기본부터 고급까지(1) (# 3일차-1) 본문

AI/Naver_Boostcamp AI Tech

텐서 연산 마스터하기: 기본부터 고급까지(1) (# 3일차-1)

john8538 2024. 8. 7. 20:42

01) 텐서 결합 연산

PyTorch에서 텐서를 결합하는 두 가지 주요 방법은 stackcat(concatenate)입니다.

1.1 torch.cat()

import torch

a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
c = torch.cat((a, b))
print(c)# 출력: tensor([1, 2, 3, 4, 5, 6])

cat은 지정된 차원을 따라 텐서들을 연결합니다. 기본적으로 0번 차원을 따라 연결합니다.

1.2 torch.stack()

d = torch.stack((a, b))
print(d)# 출력: tensor([[1, 2, 3],#         [4, 5, 6]])

stack은 새로운 차원을 만들어 그 차원을 따라 텐서들을 쌓습니다.

언제 무엇을 사용해야 할까요? 기존 차원을 따라 텐서를 이어 붙이려면 cat을, 새로운 차원을 만들어 텐서를 쌓으려면 stack을 사용하면 됩니다.

02) 텐서 확장 연산

2.1 torch.expand()

a = torch.tensor([1, 2, 3])
b = a.expand(3, -1)
print(b)# 출력: tensor([[1, 2, 3],#         [1, 2, 3],#         [1, 2, 3]])

expand는 텐서의 크기를 늘리지만, 실제로 메모리를 복사하지 않습니다.

2.2 torch.repeat()

c = a.repeat(3, 1)
print(c)# 출력: tensor([[1, 2, 3],#         [1, 2, 3],#         [1, 2, 3]])

repeat는 텐서의 내용을 실제로 복사하여 반복합니다.

Attention mask에서는 주로 expand를 사용합니다.

예를 들어:

mask = torch.tensor([[1, 0, 0], [1, 1, 0], [1, 1, 1]])
expanded_mask = mask.unsqueeze(0).expand(5, -1, -1)

이렇게 하면 배치 크기만큼 마스크를 효율적으로 확장할 수 있습니다.

03) 기본 산술 연산

PyTorch는 기본적인 산술 연산을 위한 함수와 연산자를 제공합니다:

  • 덧셈: + 또는 torch.add()
  • 뺄셈: -또는 torch.sub()
  • 곱셈: *또는 torch.mul()
  • 나눗셈: / 또는 torch.div()

예를 들어:

a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
print(a + b)# 출력: tensor([5, 7, 9])
print(torch.add(a, b))# 같은 결과

04) 비교 연산

텐서 간 비교를 위해 다음과 같은 함수들을 사용할 수 있습니다:

  • torch.eq(): 같음
  • torch.ne(): 같지 않음
  • torch.lt(): 작음
  • torch.gt(): 큼
  • torch.le(): 작거나 같음
  • torch.ge(): 크거나 같음

예:

a = torch.tensor([1, 2, 3])
b = torch.tensor([2, 2, 2])
print(torch.gt(a, b))# 출력: tensor([False, False,  True])

04) 행렬 연산

행렬 곱셈을 위해 torch.matmul()이나 torch.mm()을 사용할 수 있습니다:

a = torch.tensor([[1, 2], [3, 4]])
b = torch.tensor([[5, 6], [7, 8]])
print(torch.matmul(a, b))# 출력: tensor([[19, 22],#         [43, 50]])

matmul은 브로드캐스팅을 지원하므로 배치 연산에 유용하고, mm은 2D 텐서에만 사용할 수 있습니다.

05) 논리 연산

논리 연산을 위해 다음 함수들을 사용할 수 있습니다:

  • torch.logical_and()
  • torch.logical_or()
  • torch.logical_not()

예:

a = torch.tensor([True, False, True])
b = torch.tensor([False, False, True])
print(torch.logical_and(a, b))# 출력: tensor([False, False,  True])

05) 수학 연산

PyTorch는 다양한 수학 함수를 제공합니다:

  • torch.pow(): 거듭제곱
  • torch.sqrt(): 제곱근
  • torch.exp(): 지수 함수
  • torch.log(): 자연로그
  • torch.sin(), torch.cos(), torch.tan(): 삼각함수

예:

a = torch.tensor([1, 2, 3])
print(torch.pow(a, 2))# 출력: tensor([1, 4, 9])

05) 인플레이스(Inplace) 연산

인플레이스 연산은 텐서를 직접 수정합니다. 함수 이름 뒤에 '_'를 붙여 사용합니다:

a = torch.tensor([1, 2, 3])
a.add_(1)
print(a)# 출력: tensor([2, 3, 4])

주의: 인플레이스 연산은 메모리 효율적이지만, autograd를 사용할 때 주의해야 합니다. 그래디언트 계산에 문제를 일으킬 수 있기 때문입니다.

 

 

PyTorch의 텐서 연산을 마스터하면 효율적이고 읽기 쉬운 코드를 작성할 수 있습니다. 이 포스트에서 다룬 연산들을 잘 활용하여 여러분의 딥러닝 프로젝트를 한 단계 발전시켜 보세요!

 

 

추가 자료