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

     

     

    추가 자료