본문 바로가기
Language&Framework&Etc/Pytorch

Pytorch란 무엇인가요? - 연산 (Pytorch 학습 2)

by 머리올리자 2021. 4. 16.

1. 덧셈

 

import torch

# 1 
x = torch.ones(5, 3)
y = torch.rand(5, 3)
print(x + y)

# 2
print(torch.add(x, y))

# 3
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)

# 4 in-place
y.add_(x)
print(y)

 

위 출력 결과는 모두 동일하다.

tensor([[1.5353, 1.6422, 1.8407],
        [1.9036, 1.7170, 1.7341],
        [1.9691, 1.9267, 1.1749],
        [1.5314, 1.8827, 1.8450],
        [1.7856, 1.8662, 1.8147]])
tensor([[1.5353, 1.6422, 1.8407],
        [1.9036, 1.7170, 1.7341],
        [1.9691, 1.9267, 1.1749],
        [1.5314, 1.8827, 1.8450],
        [1.7856, 1.8662, 1.8147]])
tensor([[1.5353, 1.6422, 1.8407],
        [1.9036, 1.7170, 1.7341],
        [1.9691, 1.9267, 1.1749],
        [1.5314, 1.8827, 1.8450],
        [1.7856, 1.8662, 1.8147]])
tensor([[1.5353, 1.6422, 1.8407],
        [1.9036, 1.7170, 1.7341],
        [1.9691, 1.9267, 1.1749],
        [1.5314, 1.8827, 1.8450],
        [1.7856, 1.8662, 1.8147]])

 

다만 유의해야 할 점이 4번이다.

 

4번 연산의 경우 바꿔치기(in-place) 방식을 사용하고 있어 결과를 새로운 변수에 저장하는 것이 아닌 기존의 y 변수에 덮어쓰는 방식으로 연산하였다.

 

※ 참고

in-place 방식으로 tensor의 값을 변경하는 연산 뒤에는 "_"가 붙는다.

(예. x.copy_(y), x.t_()는 x를 변경한다.)

 

2. numpy slicing과 비슷하게 사용 가능

import torch

x = torch.rand(5, 3)
print(x)
print(x[:, 1])

결과

tensor([[0.6917, 0.1097, 0.8707],
        [0.7086, 0.3453, 0.5436],
        [0.2096, 0.1345, 0.1604],
        [0.8114, 0.3754, 0.7168],
        [0.3526, 0.6675, 0.9477]])
tensor([0.1097, 0.3453, 0.1345, 0.3754, 0.6675])

 

3. 모양 변경시(view)

import torch

x = torch.rand(8, 2)
y = x.view(16)
z = x.view(-1, 4)

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

결과

tensor([[0.0287, 0.7503],
        [0.1686, 0.8256],
        [0.0713, 0.4219],
        [0.1449, 0.8680],
        [0.1448, 0.8632],
        [0.9290, 0.1296],
        [0.3076, 0.3742],
        [0.8265, 0.5202]])
torch.Size([8, 2])

tensor([0.0287, 0.7503, 0.1686, 0.8256, 0.0713, 0.4219, 0.1449, 0.8680, 0.1448,
        0.8632, 0.9290, 0.1296, 0.3076, 0.3742, 0.8265, 0.5202])
torch.Size([16])

tensor([[0.0287, 0.7503, 0.1686, 0.8256],
        [0.0713, 0.4219, 0.1449, 0.8680],
        [0.1448, 0.8632, 0.9290, 0.1296],
        [0.3076, 0.3742, 0.8265, 0.5202]])
torch.Size([4, 4])

 

 

4. tensor에 하나의 값만 존재한다면, .item()을 사용해서 숫자 값을 얻을 수 있다.

import torch

x = torch.rand(1)
print(x)
print(x.item())
tensor([0.2495])
0.24952447414398193

 

5. TENSOR -> NUMPY

import torch

a = torch.ones(5)
print(a)

b = a.numpy()
print(b)
tensor([1., 1., 1., 1., 1.])
[1. 1. 1. 1. 1.]

5-1. in-place

import torch

a = torch.ones(5)
print(a)

b = a.numpy()
print(b)

a.add_(1)
print(a)
print(b)
tensor([1., 1., 1., 1., 1.])
[1. 1. 1. 1. 1.]
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]

 

6. NUMPY -> TENSOR

import torch
import numpy as np

a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)

print(a)
print(b)
[2. 2. 2. 2. 2.]
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

7. TO CUDA

import torch

x = torch.randn(1)

if torch.cuda.is_available():
    device = torch.device("cuda")          # CUDA 장치 객체(device object)로

    # TO GPU
    y = torch.ones_like(x, device=device)  # GPU 상에 직접적으로 tensor를 생성하거나
    x = x.to(device)                       # ``.to("cuda")`` 를 사용
    z = x + y
    print(z)
    print(z.to("cpu", torch.double))       # ``.to`` 는 dtype도 함께 변경
tensor([0.2956], device='cuda:0')
tensor([0.2956], dtype=torch.float64)