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

PyTorch에서 텐서 요소별 나눗셈 수행하기 – torch.div() 사용법과 예제

PyTorch에서 두 텐서 사이의 요소별(element-wise) 나눗셈을 수행하려면 torch.div() 메서드를 사용하면 됩니다. 이 메서드는 첫 번째 입력 텐서의 각 요소를 두 번째 텐서의 대응하는 요소로 나눕니다. 텐서를 스칼라 값으로 나누는 것도 가능하고, 차원이 같은 텐서끼리는 물론 서로 다른 차원의 텐서끼리도 나눗셈할 수 있습니다. 이때 결과 텐서의 차원은 항상 더 높은 차원의 텐서를 따릅니다. 예를 들어 1D 텐서를 2D 텐서로 나누면 결과는 2D 텐서가 됩니다.

torch.div() 사용 단계

  • 필요한 라이브러리를 임포트합니다. 아래의 모든 파이썬 예제에서는 torch 라이브러리가 필요하므로 미리 설치되어 있는지 확인하세요.

  • 나눗셈에 사용할 두 개 이상의 PyTorch 텐서를 정의하고 출력합니다. 텐서를 스칼라로 나누려면 스칼라 값도 함께 정의합니다.

  • torch.div()를 사용해 텐서를 다른 텐서나 스칼라로 나누고, 그 결과를 새 변수에 할당합니다. 이 메서드는 원본 텐서를 수정하지 않고 새로운 텐서를 반환합니다.

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

예제 1 – 텐서를 스칼라로 나누기

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

# 텐서 생성
t = torch.Tensor([2, 3, 5, 9])
print("원본 텐서 t:\n", t)

# 텐서를 스칼라 4로 나누기
v = torch.div(t, 4)
print("요소별 나눗셈 결과:\n", v)

# 아래 방식으로도 동일한 결과를 얻을 수 있습니다
t1 = torch.Tensor([4])
w = torch.div(t, t1)
print("요소별 나눗셈 결과:\n", w)

# 위 연산의 또 다른 구현 방법
t2 = torch.Tensor([4,4,4,4])
x = torch.div(t, t2)
print("요소별 나눗셈 결과:\n", x)

실행 결과

원본 텐서 t:
    tensor([2., 3., 5., 9.])
요소별 나눗셈 결과:
    tensor([0.5000, 0.7500, 1.2500, 2.2500])
요소별 나눗셈 결과:
    tensor([0.5000, 0.7500, 1.2500, 2.2500])
요소별 나눗셈 결과:
    tensor([0.5000, 0.7500, 1.2500, 2.2500])

세 가지 방식 모두 동일한 결과를 반환합니다. 스칼라로 나누든, 같은 값으로 채운 1D 텐서로 나누든, 크기가 같은 텐서로 요소별 나눗셈을 하든 결과는 같다는 점을 확인할 수 있습니다.

예제 2 – 2D 텐서를 1D 텐서로 나누기

다음 파이썬 프로그램은 2D 텐서를 1D 텐서로 나누는 방법을 보여줍니다.

# 필요한 라이브러리 임포트
import torch

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

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

# 2D 텐서를 1D 텐서로 나누기
v = torch.div(T1, T2)
print("요소별 나눗셈 결과:\n", v)

실행 결과

T1:
tensor([[3., 2.],
        [7., 5.]])
T2:
tensor([10., 8.])
요소별 나눗셈 결과:
tensor([[0.3000, 0.2500],
        [0.7000, 0.6250]])

1D 텐서 T2가 각 행에 브로드캐스팅(broadcasting)되어 열 방향으로 나눗셈이 수행된 것을 볼 수 있습니다.

예제 3 – 1D 텐서를 2D 텐서로 나누기

다음 파이썬 프로그램은 1D 텐서를 2D 텐서로 나누는 방법을 보여줍니다.

# 1D 텐서를 2D 텐서로 나누는 파이썬 프로그램
# 필요한 라이브러리 임포트
import torch

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

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

# 1D 텐서를 2D 텐서로 나누기
v = torch.div(T2, T1)
print("1D 텐서를 2D 텐서로 나눈 결과:\n", v)

실행 결과

T1:
tensor([[8., 7.],
        [4., 5.]])
T2:
tensor([10., 5.])
1D 텐서를 2D 텐서로 나눈 결과:
tensor([[1.2500, 0.7143],
        [2.5000, 1.0000]])

결과 텐서가 2D 형태임을 알 수 있습니다. 이는 낮은 차원의 텐서가 더 높은 차원의 텐서에 맞춰 자동으로 브로드캐스팅되기 때문입니다.

예제 4 – 2D 텐서를 2D 텐서로 나누기

다음 파이썬 프로그램은 2D 텐서를 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)

# T1을 T2로 나누기
v = torch.div(T1,T2)
print("요소별 나눗셈 결과:\n", v)

실행 결과

T1:
tensor([[8., 7.],
        [3., 4.]])
T2:
tensor([[0., 3.],
        [4., 9.]])
요소별 나눗셈 결과:
tensor([[ inf, 2.3333],
        [0.7500, 0.4444]])

정리 및 참고 사항

  • 0으로 나누더라도 오류가 발생하지 않으며, 해당 위치에는 inf(무한대) 값이 반환됩니다. (예제 4의 첫 번째 요소 참고)
  • torch.div() 대신 / 연산자(예: t / 4, T1 / T2)를 사용해도 동일한 결과를 얻을 수 있습니다.
  • 결과 텐서의 shape(모양)는 항상 두 입력 텐서 중 더 높은 차원의 텐서를 따릅니다.