텐서에 대해 요소별(element-wise) 뺄셈을 수행하려면 PyTorch의 torch.sub() 메서드를 사용할 수 있습니다. 이 메서드는 두 텐서의 대응하는 요소들을 서로 빼는 연산을 수행합니다. 스칼라 값을 텐서에서 뺄 수도 있고, 텐서에서 다른 텐서를 뺄 수도 있습니다. 차원이 같은 텐서뿐 아니라 차원이 서로 다른 텐서 간의 연산도 가능하며, 최종 결과 텐서의 차원은 더 높은 차원의 텐서와 동일하게 됩니다.
수행 단계
필요한 라이브러리를 임포트합니다. 아래의 모든 Python 예제에서 필요한 라이브러리는 torch입니다. 미리 설치되어 있는지 확인하세요.
두 개 이상의 PyTorch 텐서를 정의하고 출력합니다. 스칼라 값을 빼고 싶다면 해당 스칼라 값도 정의합니다.
torch.sub() 메서드를 사용해 텐서에서 스칼라 또는 다른 텐서를 빼고, 그 결과를 새 변수에 할당합니다. 텐서에서 스칼라 값을 빼는 것도 가능합니다. 이 메서드로 뺄셈을 수행해도 원본 텐서에는 어떠한 변경도 일어나지 않습니다.
최종 결과 텐서를 출력합니다.
예제 1: 텐서에서 스칼라 값 빼기
아래는 텐서에서 스칼라 값을 빼는 Python 3 프로그램입니다. 동일한 작업을 세 가지 다른 방법으로 수행해 보겠습니다.
# 텐서에 대해 요소별 뺄셈을 수행하는 Python 프로그램
# 필요한 라이브러리 임포트
import torch
# 텐서 생성
t = torch.Tensor([1.5, 2.03, 3.8, 2.9])
print("Original Tensor t:\n", t)
# 텐서에서 스칼라 값 빼기
v = torch.sub(t, 5.60)
print("Element-wise subtraction result:\n", v)
# 아래와 같은 방법으로도 동일한 결과를 얻을 수 있습니다
t1 = torch.Tensor([5.60])
w = torch.sub(t, t1)
print("Element-wise subtraction result:\n", w)
# 위 연산을 수행하는 또 다른 방법
t2 = torch.Tensor([5.60, 5.60, 5.60, 5.60])
x = torch.sub(t, t2)
print("Element-wise subtraction result:\n", x)
출력 결과
Original Tensor t:
tensor([1.5000, 2.0300, 3.8000, 2.9000])
Element-wise subtraction result:
tensor([-4.1000, -3.5700, -1.8000, -2.7000])
Element-wise subtraction result:
tensor([-4.1000, -3.5700, -1.8000, -2.7000])
Element-wise subtraction result:
tensor([-4.1000, -3.5700, -1.8000, -2.7000])
위 예제에서 볼 수 있듯이, 스칼라 값을 직접 빼거나 스칼라 값을 담은 텐서를 만들어 빼거나, 같은 값으로 채워진 텐서를 생성해 빼더라도 모두 동일한 결과가 출력됩니다.
예제 2: 2차원 텐서에서 1차원 텐서 빼기
다음 프로그램은 2차원(2-D) 텐서에서 1차원(1-D) 텐서를 빼는 방법을 보여줍니다.
# 필요한 라이브러리 임포트
import torch
# 2차원 텐서 생성
T1 = torch.Tensor([[8, 7], [4, 5]])
# 1차원 텐서 생성
T2 = torch.Tensor([10, 5])
print("T1:\n", T1)
print("T2:\n", T2)
# 2차원 텐서에서 1차원 텐서 빼기
v = torch.sub(T1, T2)
print("Element-wise subtraction result:\n", v)
출력 결과
T1:
tensor([[8., 7.],
[4., 5.]])
T2:
tensor([10., 5.])
Element-wise subtraction result:
tensor([[-2., 2.],
[-6., 0.]])
1차원 텐서 T2의 각 요소가 2차원 텐서 T1의 각 행에 대응하는 요소들과 자동으로 매칭되어(broadcasting) 뺄셈이 수행됩니다.
예제 3: 1차원 텐서에서 2차원 텐서 빼기
다음 프로그램은 반대로 1차원 텐서에서 2차원 텐서를 빼는 방법을 보여줍니다.
# 1차원 텐서에서 2차원 텐서를 빼는 Python 프로그램
# 라이브러리 임포트
import torch
# 2차원 텐서 생성
T1 = torch.Tensor([[1, 2], [4, 5]])
# 1차원 텐서 생성
T2 = torch.Tensor([10, 5])
print("T1:\n", T1)
print("T2:\n", T2)
# 1차원 텐서에서 2차원 텐서 빼기
v = torch.sub(T2, T1)
print("Element-wise subtraction result:\n", v)
출력 결과
T1:
tensor([[1., 2.],
[4., 5.]])
T2:
tensor([10., 5.])
Element-wise subtraction result:
tensor([[9., 3.],
[6., 0.]])
결과 텐서가 2차원 텐서인 점에 주목하세요. 앞서 설명했듯이, 최종 결과의 차원은 항상 더 높은 차원의 텐서를 따르게 됩니다.
예제 4: 2차원 텐서에서 2차원 텐서 빼기
다음 프로그램은 2차원 텐서에서 또 다른 2차원 텐서를 빼는 방법을 보여줍니다.
# 라이브러리 임포트
import torch
# 두 개의 2차원 텐서 생성
T1 = torch.Tensor([[8, 7], [3, 4]])
T2 = torch.Tensor([[0, 3], [4, 9]])
print("T1:\n", T1)
print("T2:\n", T2)
# 위 두 2차원 텐서의 뺄셈 수행
v = torch.sub(T1, T2)
print("Element-wise subtraction result:\n", v)
출력 결과
T1:
tensor([[8., 7.],
[3., 4.]])
T2:
tensor([[0., 3.],
[4., 9.]])
Element-wise subtraction result:
tensor([[ 8., 4.],
[-1., -5.]])
정리
PyTorch의 torch.sub() 메서드를 사용하면 스칼라, 1차원, 2차원 텐서 등 다양한 형태의 피연산자에 대해 손쉽게 요소별 뺄셈을 수행할 수 있습니다. 특히 차원이 다른 텐서 간 연산 시에는 브로드캐스팅 규칙에 따라 자동으로 형상이 맞춰지며, 결과 텐서의 차원은 입력 텐서 중 더 높은 차원을 따른다는 점을 기억해 두면 유용합니다.