Tensor의 연산

J. Hwang·2024년 8월 7일
0

add

  • 크기가 동일한 두 tensor의 각 요소들을 더한 값을 출력
  • c = torch.add(a, b)
a = torch.tensor([[1, 2], [3, 4]])
b = torch.tensor([[5, 6], [7, 8]])
c = torch.add(a, b)     # tensor([[6, 8], [10, 12]])
  • in-place 방식으로 더하려면 a.add_(b) 와 같이 하면 된다.
  • 크기가 다른 두 tensor를 더할 때에는, 크기가 작은 tensor가 크기가 큰 tensor의 크기로 확장되어 연산된다.
# add 2 tensors with different sizes
a = torch.tensor([[1, 2], [3, 4]])
b = torch.tensor([1, 3])

# b is expanded to tensor([[1, 3], [1, 3]]) and added
c = torch.add(a, b)     # tensor([[2, 5], [4, 7]])

sub

  • 크기가 동일한 두 tensor의 각 요소들을 뺀 값을 출력
  • c = torch.sub(a,b)
a = torch.tensor([[5, 6], [7, 8]])
b = torch.tensor([[1, 2], [3, 4]])
c = torch.sub(a, b)      # tensor([[4, 4],[4, 4]])
  • in-place 방식으로 빼려면 a.sub_(b) 와 같이 하면 된다.
  • 크기가 다른 두 tensor를 뺄 때는, 크기가 작은 tensor가 크기가 큰 tensor의 크기로 확장되어 연산된다.

multiplication

  • c = torch.mul(a, b) 과 같이 사용
    a가 스칼라 값인 경우 tensor b의 각 요소에 a가 곱해진 결과가 출력되고,
    a도 b와 크기가 같은 tensor인 경우 a와 b의 각 요소들이 곱해진 결과가 출력된다.
a = 3
b = torch.tensor([[1, 2], [3, 4]])
c = torch.tensor([[5, 6], [7, 8]])

# scalar multiplication
d = torch.mul(a, b)       # tensor([3, 6], [9, 12]])

# elementwise product (= hardmode product)
e = torch.mul(b, c)      # tensor([[5, 12], [21, 28]])
  • in-place 방식으로 곱하려면 a.mul_(b) 와 같이 하면 된다.
  • 크기가 다른 두 tensor를 곱할 때에는 더하기, 빼기와 마찬가지로 크기가 작은 tensor가 크기가 큰 tensor의 크기로 확장되어 연산된다.

division

  • 크기가 동일한 두 tensor의 각 요소들을 나눈 값을 출력
  • c = torch.div(a, b)
  • in-place 방식으로 나누려면 a.div_(b) 와 같이 하면 된다.
a = torch.tensor([[20, 18], [7, 16]])
b = torch.tensor([[5, 6], [7, 8]])
c = torch.div(a, b)      # tensor([[4, 3], [1, 3]])
  • 크기가 다른 두 tensor를 나눌 때에도 마찬가지로 크기가 작은 tensor가 크기가 큰 tensor의 크기로 확장되어 연산된다.

exponentiation

  • tensor의 각 요소들에 대해 n제곱을 하는 기능
  • c = torch.pow(a, b)
    b가 스칼라 값인 경우 tensor a의 각 요소들에 b제곱 된 결과가 출력되고,
    b도 a와 크기가 같은 tensor인 경우 a의 각 요소들에 b의 요소들의 값만큼 거듭제곱한 값이 출력된다.
a = torch.tensor([[1, 2], [3, 4]])
b = 3
c = torch.tensor([[5, 4], [3, 2]])

# exponentiation between a scalar and a tensor
d = torch.pow(a, b)      # tensor([[1, 8], [27, 64]])

# exponentiation between tensors
e = torch.pow(a, c)      # tensor([[1, 16], [27, 16]])
  • in-place 방식으로 연산하려면 a.pow_(b)
  • 이를 이용해서 거듭제곱근 역시 구할 수 있다. 위 코드의 예시로 보면, tensor a의 요소들의 3제곱근을 계산하고 싶으면 b = 1/3으로 두면 된다.

두 tensor의 요소가 동일한지 판단

  • 두 tensor의 대응 요소들이 같은지를 비교하여 Boolean tensor로 출력하는 기능
  • c = torch.eq(a, b)
a = torch.tensor([[1, 2], [3, 4]])
b = torch.tensor([[1, 5], [3, 4]])
c = torch.eq(a, b)      # tensor([[True, False], [True, True]])
  • 반대로 두 tensor의 대응 요소들이 다른지를 비교하여 Boolean tensor로 출력하고 싶다면 torch.ne(a, b)를 이용하면 된다.

두 tensor의 요소 숫자 크기 비교

  • torch.gt(a, b) 와 같이 사용하는데 a가 b보다 큰지 (greater than) 비교
  • torch.ge(a, b) 를 하면 a가 b보다 크거나 같은지 (greater or equal than) 비교
  • torch.lt(a, b) 해서 a가 b보다 작은지 (less than) 비교
  • torch.le(a, b) 해서 a가 b보다 작거나 같은지 (less or equal than) 비교
a = torch.tensor([1, 2, 3, 4])
b = torch.tensor([1, 3, 1, 2])

# compare
c = torch.gt(a, b)      # tensor([False, False, True, True])
d = torch.ge(a, b)      # tensor([True, False, True, True])
e = torch.lt(a, b)      # tensor([False, True, False, False])
f = torch.le(a, b)      # tensor([True, True, False, False])

2-D tensor 곱셈

  • 2-D tensor의 곱은 결국 행렬의 곱셈과 같다. 이러한 행렬의 곱셈은 신경망 구현에 핵심이 되는 연산이다.
  • a.matmul(b), a.mm(b), a@b 를 통해서 2-D tensor a와 b 사이의 곱셈을 계산할 수 있다.
a = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = torch.tensor([[1, 0], [1, -1], [2, 1]])

c = a.matmul(b)
d = a.mm(b)
e = a@b
# c, d, e all returns tensor([[ 9,  1], [21,  1], [33,  1]])

★ 행렬의 곱셈 연산을 이용하면 흑백 이미지 (→ 2-D tensor) 의 대칭 이동 (축을 기준으로 이미지를 뒤집는 변환) 을 할 수 있다.

profile
Let it code

0개의 댓글