Pytorch Tensor Operation

  • 기본 사칙연산을 포함하는 기본 연산이 텐서에서 어떠한 식으로 이루어지는 아는 것은 매우 중요하다.
import torch

a = torch.FloatTensor([[1, 2],
                       [3, 4]])
b = torch.FloatTensor([[2, 2],
                       [3, 3]])

1. Element-wise operations

  • 덧셈, 뺏셈, 곱셈, 나눗셈 연산자 (+, -, *, /)
  • 동등 비교 연산자 (==, !=)
  • 제곱 연산자 (**)
#----- 덧셈
print("덧셈 연산:\n{}\n".format(a + b))

#----- 뺄셈
print("뺄셈 연산:\n{}\n".format(a - b))

#----- 곱셈
print("곱셈 연산:\n{}\n".format(a * b))

#----- 나눗셈
print("나눗셈 연산:\n{}\n".format(a / b))

[결과]

덧셈 연산:
tensor([[3., 4.],
        [6., 7.]])

뺄셈 연산:
tensor([[-1.,  0.],
        [ 0.,  1.]])

곱셈 연산:
tensor([[ 2.,  4.],
        [ 9., 12.]])

나눗셈 연산:
tensor([[0.5000, 1.0000],
        [1.0000, 1.3333]])

2. Sum, Mean (Dimension Reducing Operations)

  • 같은 shape의 텐서끼리 sum과 mean 연산을 수행하면, dimension이 줄어들게 된다.
  • 어떤 dimension을 기준으로 연산을 할 지 정할 수도 있다.

2차원 텐서

[코드]

x = torch.FloatTensor([[1, 2],
                       [3, 4]])
print(x.sum())
print(x.mean())

[결과]

tensor(10.)
tensor(2.5000) ***

[코드]

print(x.sum(dim=0))
print(x.mean(dim=0))

[결과]

tensor([4., 6.])
tensor([2., 3.]) ***

3차원 텐서

[코드]

x = torch.FloatTensor([[[1, 2, 2],
                        [3, 4, 4]],
                       [[5, 6, 6],
                        [7, 8, 8]],
                       [[9, 10, 10],
                        [11, 12, 12]]])
print(x.sum(dim=0), x.size(), "\n")
print(x.sum(dim=1), x.size(), "\n")
print(x.sum(dim=2), x.size(), "\n") # <-> x.sum(dim=-1)

[결과]

tensor([[15., 18., 18.],
        [21., 24., 24.]]) torch.Size([3, 2, 3]) 

tensor([[ 4.,  6.,  6.],
        [12., 14., 14.],
        [20., 22., 22.]]) torch.Size([3, 2, 3]) 

tensor([[ 5., 11.],
        [17., 23.],
        [29., 35.]]) torch.Size([3, 2, 3]) 

3. BoradCast in Operations

  • 다른 shape를 가진 tensor끼리 연산을 가능하게 한다.
    (dim이 낮은 텐서에서 dim을 높은 텐서에 맞춰 dim을 확장한 후 연산하는 원리)

  • 모든 shape의 tensor끼리 연산이 가능한 것은 아니다.

Tensor + Scalar

[코드]

x = torch.FloatTensor([[1, 2],
                       [3, 4]])
y = 1

[코드]

print(x + y)

[결과]

tensor([[2., 3.],
        [4., 5.]])

Tensor + Vector

[코드]

 x = torch.FloatTensor([[1, 2],
                       [4, 8]])
y = torch.FloatTensor([3, 5])

print(x.size())
print(y.size())

[결과]

torch.Size([2, 2])
torch.Size([2])

[코드]

z = x + y
print(z)
print(z.size())

[결과]

tensor([[ 4.,  7.],
        [ 7., 13.]])
torch.Size([2, 2])

Tensor + Tensor

[코드]

x = torch.FloatTensor([[1, 2]])
y = torch.FloatTensor([[3],
                       [5]])

print(x.size())
print(y.size())

[결과]

torch.Size([1, 2])
torch.Size([2, 1])

[코드]

z = x + y
print(z)
print(z.size())

[결과]

tensor([[4., 5.],
        [6., 7.]])
torch.Size([2, 2]) ***

위 수행 결과는 아래와 같이 이루어 진 것과 같다.

[코드]

x = torch.FloatTensor([[1, 2],
                       [1, 2]])
y = torch.FloatTensor([[3, 3],
                       [5, 5]])
z = x + y
print(z)
print(z.size())

[결과]

tensor([[4., 5.],
        [6., 7.]])
torch.Size([2, 2])

이 포스팅은 패스트캠퍼스 김기현의 딥러닝 유치원 강의 기반으로 작성되었다.