Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

PyTorch에서 텐서의 요소별 곱셈(Hadamard 곱) 수행하기

torch.mul() 메서드는 PyTorch에서 텐서 간 요소별(element-wise) 곱셈을 수행하는 데 사용됩니다. 이 메서드는 두 텐서의 대응하는 요소들을 서로 곱하며, 스칼라 값과 텐서를 곱할 수도 있습니다.

텐서 간 요소별 곱셈은 차원이 같은 경우에만 가능한 것이 아니라, 서로 다른 차원의 텐서도 브로드캐스팅(broadcasting) 규칙에 따라 곱할 수 있습니다. 최종 결과 텐서의 차원은 입력 텐서 중 더 높은 차원을 가진 텐서와 동일하게 됩니다. 참고로, 텐서의 요소별 곱셈은 아다마르 곱(Hadamard product)이라고도 불립니다.

수행 단계

  • 필요한 라이브러리를 임포트합니다. 아래의 모든 Python 예제에서 필요한 라이브러리는 torch이므로, 사전에 설치되어 있어야 합니다.

  • 곱셈에 사용할 PyTorch 텐서를 두 개 이상 정의하고 출력합니다. 스칼라 값을 곱하고 싶다면 해당 스칼라 값도 함께 정의합니다.

  • torch.mul()을 사용하여 텐서를 곱하고 그 결과를 새 변수에 할당합니다. 스칼라 값과 텐서를 곱할 수도 있습니다. 이 메서드는 원본 텐서를 변경하지 않고 새로운 텐서를 반환합니다.

  • 최종 결과 텐서를 출력합니다.

예제 1: 스칼라와 텐서의 곱셈

다음 프로그램은 스칼라 값과 텐서를 곱하는 방법을 보여줍니다. 스칼라 대신 동일한 값으로 채워진 텐서를 사용해도 같은 결과를 얻을 수 있습니다.

# 요소별 곱셈을 수행하는 Python 프로그램
# 필요한 라이브러리 임포트
import torch

# 텐서 생성
t = torch.Tensor([2.05, 2.03, 3.8, 2.29])
print("Original Tensor t:\n", t)

# 텐서에 스칼라 값 곱하기
v = torch.mul(t, 7)
print("Element-wise multiplication result:\n", v)

# 아래와 같은 방식으로도 동일한 결과 얻기 가능
t1 = torch.Tensor([7])
w = torch.mul(t, t1)
print("Element-wise multiplication result:\n", w)

# 위 연산의 다른 방법
t2 = torch.Tensor([7,7,7,7])
x = torch.mul(t, t2)
print("Element-wise multiplication result:\n", x)

출력

Original Tensor t:
    tensor([2.0500, 2.0300, 3.8000, 2.2900])
Element-wise multiplication result:
    tensor([14.3500, 14.2100, 26.6000, 16.0300])
Element-wise multiplication result:
    tensor([14.3500, 14.2100, 26.6000, 16.0300])
Element-wise multiplication result:
    tensor([14.3500, 14.2100, 26.6000, 16.0300])

세 가지 방식 모두 동일한 결과가 출력되는 것을 확인할 수 있습니다.

예제 2: 1D 텐서와 2D 텐서의 곱셈

다음 Python 프로그램은 1차원(1D) 텐서와 2차원(2D) 텐서를 곱하는 방법을 보여줍니다. 브로드캐스팅 덕분에 1D 텐서가 2D 텐서의 각 행에 자동으로 적용됩니다.

import torch

# 2D 텐서 생성
T1 = torch.Tensor([[3,2],[7,5]])

# 1D 텐서 생성
T2 = torch.Tensor([10, 8])
print("T1:\n", T1)
print("T2:\n", T2)

# 1D 텐서와 2D 텐서 곱하기
v = torch.mul(T1, T2) # v = torch.mul(T2,T1)
print("Element-wise multiplication result:\n", v)

출력

T1:
tensor([[3., 2.],
        [7., 5.]])
T2:
tensor([10., 8.])
Element-wise multiplication result:
tensor([[30., 16.],
        [70., 40.]])

결과를 보면 2D 텐서의 첫 번째 열에는 T2[0] = 10, 두 번째 열에는 T2[1] = 8이 각각 곱해진 것을 알 수 있습니다.

예제 3: 두 개의 2D 텐서 곱셈

다음 Python 프로그램은 크기가 같은 두 개의 2D 텐서를 곱하는 방법을 보여줍니다. 각 위치에서 대응하는 요소끼리 서로 곱해집니다.

import torch

# 두 개의 2D 텐서 생성
T1 = torch.Tensor([[8,7],[3,4]])
T2 = torch.Tensor([[0,3],[4,9]])
print("T1:\n", T1)
print("T2:\n", T2)

# 두 2D 텐서 곱하기
v = torch.mul(T1, T2)
print("Element-wise multiplication result:\n", v)

출력

T1:
tensor([[8., 7.],
        [3., 4.]])
T2:
tensor([[0., 3.],
        [4., 9.]])
Element-wise multiplication result:
tensor([[ 0., 21.],
        [12., 36.]])

예를 들어, 결과의 첫 번째 요소는 8 × 0 = 0, 두 번째 요소는 7 × 3 = 21처럼 계산됩니다.

정리

torch.mul() 외에도 t * t2 처럼 * 연산자를 사용하거나 torch.Tensor.mul_()(인플레이스 연산)을 활용할 수도 있습니다. 일반적인 행렬 곱셈(matrix multiplication)과 달리, 요소별 곱셈은 대응하는 위치의 요소끼리만 곱한다는 점을 기억하면 됩니다.