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)
'Language&Framework&Etc > Pytorch' 카테고리의 다른 글
Pytorch Multi-GPU 정리 중 (0) | 2021.12.19 |
---|---|
Pytorch 데이터 로딩 방법 (0) | 2021.06.07 |
AUTOGRAD : 자동 미분 (Pytorch tutorial) (0) | 2021.04.30 |
Pytorch란 무엇인가요? - 시작하기 (Pytorch 학습 1) (0) | 2021.04.16 |
TorchVision model funetuning (0) | 2021.01.30 |