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)과 달리, 요소별 곱셈은 대응하는 위치의 요소끼리만 곱한다는 점을 기억하면 됩니다.