๋ฐ์ํ
โ ๏ธ ๋ณธ ๋ด์ฉ์ PyTorch Korea์ ๊ณต์ ๋ฌธ์์ ๊ธฐ๋ฐํ์ฌ ๊ณต๋ถํ ๋ด์ฉ์ ์ ์๊ฒ์ด๋ ์ํด๋ฐ๋๋๋ค!
PyTorch (ํ์ดํ ์น)
PyTorch๋ Facebook's AI Research (FAIR) ํ์ ์ํด ๊ฐ๋ฐ๋ ์คํ ์์ค ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ ์ ๋๋ค.
PyTorch๋ ๋น ๋ฅด๊ณ ์ ์ฐํ ํ๋กํ ํ์ดํ์ ์ง์ํ๋ฉฐ, ๋ค์ํ ์ฐ๊ตฌ ๋ฐ ์ฐ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
PyTorch์ ์ฃผ์ ํน์ง
- ๋์ ๊ณ์ฐ ๊ทธ๋ํ (Dynamic Computation Graph): PyTorch๋ ๋์ ๊ณ์ฐ ๊ทธ๋ํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ์ ์ํ๊ณ ์ฐ์ฐ์ ์ํํฉ๋๋ค. ์ด๋ ๊ฐ ์ฐ์ฐ์ด ์คํ๋ ๋๋ง๋ค ์๋ก์ด ๊ทธ๋ํ๋ฅผ ์์ฑํ๋ฉฐ, ์ง๊ด์ ์ด๊ณ ์ ์ฐํ ๋ชจ๋ธ ์ ์ ๋ฐ ๋๋ฒ๊น ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์๋ ๋ฏธ๋ถ (Autograd): PyTorch๋ ์๋ ๋ฏธ๋ถ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ, ์ญ์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ๊ธฐ์ธ๊ธฐ ๊ณ์ฐ์ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ๋ฅ๋ฌ๋ ๋ชจ๋ธ ํ์ต ์ ๋งค์ฐ ์ ์ฉํ๋ฉฐ, torch.autograd ๋ชจ๋์ ํตํด ์ง์๋ฉ๋๋ค.
- GPU ๊ฐ์: PyTorch๋ CUDA๋ฅผ ํตํ GPU ๊ฐ์์ ์ง์ํ์ฌ, ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ๋ณต์กํ ๋ชจ๋ธ์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ํ ์๋ฅผ GPU๋ก ์ฝ๊ฒ ์ด๋ํ๊ณ , GPU์์ ์ฐ์ฐ์ ์ํํ ์ ์์ต๋๋ค.
- ์ ์ฐํ ์ ๊ฒฝ๋ง ๋ชจ๋: PyTorch๋ ์ ๊ฒฝ๋ง ๋ชจ๋์ ์ฝ๊ฒ ์ ์ํ๊ณ ์กฐํฉํ ์ ์๋ ์ ์ฐํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. torch.nn ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ๋ค์ํ ๋ ์ด์ด์ ์์ค ํจ์ ๋ฑ์ ๊ฐํธํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
- ํ๋ถํ ์ํ๊ณ: PyTorch๋ ๋ค์ํ ๋๊ตฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ตฌ์ฑ๋ ํ๋ถํ ์ํ๊ณ๋ฅผ ๊ฐ์ถ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ ๋ก๋ฉ์ ์ํ torchvision, ๋ถ์ฐ ํ์ต์ ์ํ torch.distributed, ๊ฐํ ํ์ต์ ์ํ TorchRL ๋ฑ์ด ์์ต๋๋ค.
Tensor (ํ ์)
- PyTorch Tensor๋ PyTorch ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํต์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก, ์์น ์ฐ์ฐ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- ์ด๋ Numpy์ ndarray์ ์ ์ฌํ์ง๋ง, GPU๋ฅผ ํ์ฉํ ๊ณ ์ ์ฐ์ฐ์ ์ง์ํ๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
- ํ ์(tensor)๋ ๋ฐฐ์ด(array)์ด๋ ํ๋ ฌ(matrix)๊ณผ ๋งค์ฐ ์ ์ฌํ ํน์ํ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
- PyTorch์์๋ ํ ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ์ ๋ ฅ(input)๊ณผ ์ถ๋ ฅ(output), ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ์ ๋งค๊ฐ๋ณ์๋ค์ ๋ถํธํ(encode)ํฉ๋๋ค.
- ์๋๋ PyTorch Tensor์ ๋ํ ์ฃผ์ ๊ฐ๋ ๊ณผ ํน์ง์ ๋๋ค.
PyTorch Tensor์ ์ฃผ์ ํน์ง
- Numpy์ ์ ์ฌํ ์ธํฐํ์ด์ค: PyTorch Tensor๋ Numpy ๋ฐฐ์ด๊ณผ ์ ์ฌํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ฌ, ์ต์ํ ๋ฐฉ์์ผ๋ก ๋ค๋ฃฐ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Numpy์ ๋ฌ๋ฆฌ GPU ๊ฐ์์ ํตํด ๋ ๋น ๋ฅธ ์ฐ์ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋ค์ํ ์ฐจ์ ์ง์: 1์ฐจ์ ๋ฒกํฐ๋ถํฐ ๊ณ ์ฐจ์ ํ ์๊น์ง ๋ค์ํ ์ฐจ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ง์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ด๋ฏธ์ง, ๋น๋์ค, ์์ฑ ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- GPU ๊ฐ์ ์ง์: PyTorch Tensor๋ GPU(CUDA)๋ฅผ ํ์ฉํ ์ฐ์ฐ์ ์ง์ํ์ฌ, ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ๋ณต์กํ ์ฐ์ฐ์ ๋น ๋ฅด๊ฒ ์ํํ ์ ์์ต๋๋ค. tensor.cuda() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ ์๋ฅผ GPU๋ก ์ด๋ํ ์ ์์ต๋๋ค.
- ์๋ ๋ฏธ๋ถ(Autograd): PyTorch๋ ์๋ ๋ฏธ๋ถ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๋ฅ๋ฌ๋ ๋ชจ๋ธ ํ์ต ์ ๊ธฐ์ธ๊ธฐ(Gradient)๋ฅผ ์๋์ผ๋ก ๊ณ์ฐํ ์ ์์ต๋๋ค. ์ด๋ ์ญ์ ํ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
- ๋ค์ํ ์ด๊ธฐํ ๋ฐฉ๋ฒ: PyTorch๋ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ํ ์๋ฅผ ์ด๊ธฐํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ชจ๋ ์์๊ฐ 0์ธ ํ ์, 1์ธ ํ ์, ๋๋ค ๊ฐ์ผ๋ก ์ด๊ธฐํ๋ ํ ์ ๋ฑ์ ์์ฑํ ์ ์์ต๋๋ค.
- ํ ์๋ GPU๋ ๋ค๋ฅธ ํ๋์จ์ด ๊ฐ์๊ธฐ์์ ์คํํ ์ ์๋ค๋ ์ ๋ง ์ ์ธํ๋ฉด Numpy ์ ndarray์ ์ ์ฌํฉ๋๋ค.
- ์ค์ ๋ก ํ ์์ NumPy ๋ฐฐ์ด(array)์ ์ข ์ข ๋์ผํ ๋ด๋ถ(underly) ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ ์ ์์ด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ํ์๊ฐ ์์ต๋๋ค.
- ํ ์๋ ๋ํ ์๋ ๋ฏธ๋ถ(automatic differentiation)์ ์ต์ ํ๋์ด ์์ต๋๋ค.
- ndarray์ ์ต์ํ๋ค๋ฉด Tensor API๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ ๊ฒ์ ๋๋ค.
import torch
import numpy as np
Tensor (ํ ์) ์ด๊ธฐํ
Tensor๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ด๊ธฐํ ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์์ ๋ค์ ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
๋ฐ์ดํฐ๋ก๋ถํฐ ์ง์ (directly) ์์ฑํ๊ธฐ
- ๋ฐ์ดํฐ๋ก๋ถํฐ ์ง์ ํ ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ์ ์๋ฃํ(data type)์ ์๋์ผ๋ก ์ ์ถํฉ๋๋ค.
# ๋ค์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ํ
์ ์์ฑ
data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)
NumPy ๋ฐฐ์ด๋ก๋ถํฐ ์์ฑํ๊ธฐ
- ํ ์๋ NumPy ๋ฐฐ์ด๋ก ์์ฑํ ์ ์์ต๋๋ค.
np_array = np.array(data)
x_np = torch.from_numpy(np_array)
๋ค๋ฅธ ํ ์๋ก๋ถํฐ ์์ฑํ๊ธฐ
- ๋ช ์์ ์ผ๋ก ์ฌ์ ์(override)ํ์ง ์๋๋ค๋ฉด, ์ธ์๋ก ์ฃผ์ด์ง ํ ์์ ์์ฑ(๋ชจ์(shape), ์๋ฃํ(datatype))์ ์ ์งํฉ๋๋ค.
x_ones = torch.ones_like(x_data) # x_data์ ์์ฑ์ ์ ์งํฉ๋๋ค.
print(f"Ones Tensor: \n {x_ones} \n")
x_rand = torch.rand_like(x_data, dtype=torch.float) # x_data์ ์์ฑ์ ๋ฎ์ด์๋๋ค.
print(f"Random Tensor: \n {x_rand} \n")
Ones Tensor:
tensor([[1, 1],
[1, 1]])
Random Tensor:
tensor([[0.2622, 0.0260],
[0.2886, 0.1260]])
๋ฌด์์(random) ๋๋ ์์(constant) ๊ฐ์ ์ฌ์ฉํ๊ธฐ
- shape ์ ํ ์์ ์ฐจ์(dimension)์ ๋ํ๋ด๋ ํํ(tuple)๋ก, ์๋ ํจ์๋ค์์๋ ์ถ๋ ฅ ํ ์์ ์ฐจ์์ ๊ฒฐ์ ํฉ๋๋ค.
shape = (2,3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)
print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")
Random Tensor:
tensor([[0.8583, 0.1453, 0.4702],
[0.7411, 0.6996, 0.9439]])
Ones Tensor:
tensor([[1., 1., 1.],
[1., 1., 1.]])
Zeros Tensor:
tensor([[0., 0., 0.],
[0., 0., 0.]])
Others
- ํน์ ๊ฐ์ผ๋ก ์ด๊ธฐํ
# ๋ชจ๋ ์์๊ฐ 0์ธ ํ
์
zero_tensor = torch.zeros((3, 3))
# ๋ชจ๋ ์์๊ฐ 1์ธ ํ
์
one_tensor = torch.ones((2, 2))
# ์ฃผ์ด์ง ๊ฐ์ผ๋ก ํ
์ ์ด๊ธฐํ
full_tensor = torch.full((2, 3), 7)
print(zero_tensor)
print(one_tensor)
print(full_tensor)
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
tensor([[1., 1.],
[1., 1.]])
tensor([[7, 7, 7],
[7, 7, 7]])
- ๋ฒ์ ๊ฐ์ ๊ฐ๋ ํ ์ ์์ฑ
# ์ฐ์์ ์ธ ๊ฐ์ผ๋ก ํ
์ ์์ฑ
arange_tensor = torch.arange(0, 10, step=2)
# ๊ท ๋ฑ ๊ฐ๊ฒฉ์ผ๋ก ๋๋ ๊ฐ์ ๊ฐ๋ ํ
์ ์์ฑ
linspace_tensor = torch.linspace(0, 1, steps=5)
print(arange_tensor)
print(linspace_tensor)
tensor([0, 2, 4, 6, 8])
tensor([0.0000, 0.2500, 0.5000, 0.7500, 1.0000])
- ๊ธฐ์กด ํ ์์ ํฌ๊ธฐ๋ฅผ ๋ฐ๋ฅด๋ ํ ์ ์์ฑ
# ๊ธฐ์กด ํ
์์ ํฌ๊ธฐ๋ฅผ ๋ฐ๋ฅด๋ 0์ผ๋ก ์ฑ์์ง ํ
์ ์์ฑ
existing_tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
zeros_like_tensor = torch.zeros_like(existing_tensor)
# ๊ธฐ์กด ํ
์์ ํฌ๊ธฐ๋ฅผ ๋ฐ๋ฅด๋ 1์ผ๋ก ์ฑ์์ง ํ
์ ์์ฑ
ones_like_tensor = torch.ones_like(existing_tensor)
print(zeros_like_tensor)
print(ones_like_tensor)
tensor([[0, 0, 0],
[0, 0, 0]])
tensor([[1, 1, 1],
[1, 1, 1]])
ํ ์์ ์์ฑ(Attribute)
- ํ ์์ ์์ฑ์ ํ ์์ ๋ชจ์(shape), ์๋ฃํ(datatype) ๋ฐ ์ด๋ ์ฅ์น์ ์ ์ฅ๋๋์ง๋ฅผ ๋ํ๋ ๋๋ค.
ํ ์์ ๋ชจ์ (Shape)
- ํ ์์ ๋ชจ์์ ํ ์์ ๊ฐ ์ฐจ์์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ ๋๋ค.
import torch
# 3x2 ํ
์ ์์ฑ
tensor = torch.tensor([[1, 2], [3, 4], [5, 6]])
# ํ
์์ ๋ชจ์ ์ถ๋ ฅ
print(tensor.shape) # Output: torch.Size([3, 2])
์๋ฃํ (Datatype)
- ํ ์์ ์๋ฃํ์ ํ ์์ ์์๋ค์ด ์ด๋ค ๋ฐ์ดํฐ ํ์ ์ธ์ง๋ฅผ ๋ํ๋ ๋๋ค.
# ๊ธฐ๋ณธ ์๋ฃํ์ float
float_tensor = torch.tensor([1.0, 2.0, 3.0])
print(float_tensor.dtype) # Output: torch.float32
# ์ ์ํ ํ
์ ์์ฑ
int_tensor = torch.tensor([1, 2, 3], dtype=torch.int32)
print(int_tensor.dtype) # Output: torch.int32
# ๋ถ์ธํ ํ
์ ์์ฑ
bool_tensor = torch.tensor([True, False, True], dtype=torch.bool)
print(bool_tensor.dtype) # Output: torch.bool
์ฅ์น (Device)
- ํ ์์ ์ฅ์น๋ ํ ์๊ฐ ์ ์ฅ๋๊ณ ์ฐ์ฐ๋๋ ํ๋์จ์ด ์ฅ์น(CPU ๋๋ GPU)๋ฅผ ๋ํ๋ ๋๋ค.
# CPU์ ํ
์ ์์ฑ
cpu_tensor = torch.tensor([1, 2, 3])
print(cpu_tensor.device) # Output: cpu
# GPU๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ
if torch.cuda.is_available():
# GPU์ ํ
์ ์์ฑ
gpu_tensor = torch.tensor([1, 2, 3], device='cuda')
print(gpu_tensor.device) # Output: cuda:0
Total Example
# ํ
์ ์์ฑ
tensor = torch.tensor([[1.0, 2.0], [3.0, 4.0]], dtype=torch.float64, device='cpu')
# ํ
์ ์์ฑ ์ถ๋ ฅ
print("Shape:", tensor.shape) # Output: Shape: torch.Size([2, 2])
print("Datatype:", tensor.dtype) # Output: Datatype: torch.float64
print("Device:", tensor.device) # Output: Device: cpu
# GPU๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ
if torch.cuda.is_available():
# GPU๋ก ํ
์ ์ด๋
tensor = tensor.to('cuda')
print("Device after moving to GPU:", tensor.device) # Output: Device after moving to GPU: cuda:0
Shape: torch.Size([2, 2])
Datatype: torch.float64
Device: cpu
Tensor ์ฐ์ฐ (Operation)
- ์ ์น(transposing), ์ธ๋ฑ์ฑ(indexing), ์ฌ๋ผ์ด์ฑ(slicing), ์ํ ๊ณ์ฐ, ์ ํ ๋์, ์์ ์ํ๋ง(random sampling) ๋ฑ, 100๊ฐ์ง ์ด์์ ํ ์ ์ฐ์ฐ๋ค์ ์๋ ๋งํฌ ์์ ํ์ธํ ์ ์์ต๋๋ค.
- ๊ฐ ์ฐ์ฐ๋ค์ (์ผ๋ฐ์ ์ผ๋ก CPU๋ณด๋ค ๋น ๋ฅธ) GPU์์ ์คํํ ์ ์์ต๋๋ค.
- Colab์ ์ฌ์ฉํ๋ค๋ฉด, Edit > Notebook Settings ์์ GPU๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ํ ์๋ CPU์ ์์ฑ๋ฉ๋๋ค.
- .to ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด (GPU์ ๊ฐ์ฉ์ฑ(availability)์ ํ์ธํ ๋ค) GPU๋ก ํ ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
- ์ฅ์น๋ค ๊ฐ์ ํฐ ํ ์๋ค์ ๋ณต์ฌํ๋ ๊ฒ์ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์์ ๋น์ฉ์ด ๋ง์ด๋ ๋ค๋ ๊ฒ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค.
# GPU๊ฐ ์กด์ฌํ๋ฉด ํ
์๋ฅผ ์ด๋ํฉ๋๋ค
if torch.cuda.is_available():
tensor = tensor.to("cuda")
NumPy์์ ํ์ค ์ธ๋ฑ์ฑ๊ณผ ์ฌ๋ผ์ด์ฑ
tensor = torch.ones(4, 4)
print(f"First row: {tensor[0]}")
print(f"First column: {tensor[:, 0]}")
print(f"Last column: {tensor[..., -1]}")
tensor[:,1] = 0
print(tensor)
First row: tensor([1., 1., 1., 1.])
First column: tensor([1., 1., 1., 1.])
Last column: tensor([1., 1., 1., 1.])
tensor([[1., 0., 1., 1.],
[1., 0., 1., 1.],
[1., 0., 1., 1.],
[1., 0., 1., 1.]])
- ํ ์ ํฉ์น๊ธฐ: torch.cat ์ ์ฌ์ฉํ์ฌ ์ฃผ์ด์ง ์ฐจ์์ ๋ฐ๋ผ ์ผ๋ จ์ ํ ์๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)
tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])
์ฐ์ ์ฐ์ฐ(Arithmetic operations)
# ๋ ํ
์ ๊ฐ์ ํ๋ ฌ ๊ณฑ(matrix multiplication)์ ๊ณ์ฐํฉ๋๋ค. y1, y2, y3์ ๋ชจ๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ต๋๋ค.
# ``tensor.T`` ๋ ํ
์์ ์ ์น(transpose)๋ฅผ ๋ฐํํฉ๋๋ค.
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)
y3 = torch.rand_like(y1)
torch.matmul(tensor, tensor.T, out=y3)
# ์์๋ณ ๊ณฑ(element-wise product)์ ๊ณ์ฐํฉ๋๋ค. z1, z2, z3๋ ๋ชจ๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ต๋๋ค.
z1 = tensor * tensor
z2 = tensor.mul(tensor)
z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)
tensor([[1., 0., 1., 1.],
[1., 0., 1., 1.],
[1., 0., 1., 1.],
[1., 0., 1., 1.]])
- ๋จ์ผ-์์(single-element) ํ ์: ํ ์์ ๋ชจ๋ ๊ฐ์ ํ๋๋ก ์ง๊ณ(aggregate)ํ์ฌ ์์๊ฐ ํ๋์ธ ํ ์์ ๊ฒฝ์ฐ, item() ์ ์ฌ์ฉํ์ฌ Python ์ซ์ ๊ฐ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค:
agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))
# 12.0 <class 'float'>
- ๋ฐ๊ฟ์น๊ธฐ(in-place) ์ฐ์ฐ: ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ํผ์ฐ์ฐ์(operand)์ ์ ์ฅํ๋ ์ฐ์ฐ์ ๋ฐ๊ฟ์น๊ธฐ ์ฐ์ฐ์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, _ ์ ๋ฏธ์ฌ๋ฅผ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด: x.copy_(y) ๋ x.t_() ๋ x ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
print(f"{tensor} \n")
tensor.add_(5)
print(tensor)
tensor([[1., 0., 1., 1.],
[1., 0., 1., 1.],
[1., 0., 1., 1.],
[1., 0., 1., 1.]])
tensor([[6., 5., 6., 6.],
[6., 5., 6., 6.],
[6., 5., 6., 6.],
[6., 5., 6., 6.]])
Numpy ๋ณํ (Bridge)
CPU ์์ ํ ์์ NumPy ๋ฐฐ์ด์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์, ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ค๋ฅธ ํ๋๋ ๋ณ๊ฒฝ๋ฉ๋๋ค.
ํ ์๋ฅผ NumPy ๋ฐฐ์ด๋ก ๋ณํํ๊ธฐ
t = torch.ones(5)
print(f"t: {t}")
n = t.numpy()
print(f"n: {n}")
t: tensor([1., 1., 1., 1., 1.])
n: [1. 1. 1. 1. 1.]
- ํ ์์ ๋ณ๊ฒฝ ์ฌํญ์ด NumPy ๋ฐฐ์ด์ ๋ฐ์๋ฉ๋๋ค.
t.add_(1)
print(f"t: {t}")
print(f"n: {n}")
t: tensor([2., 2., 2., 2., 2.])
n: [2. 2. 2. 2. 2.]
NumPy ๋ฐฐ์ด์ ํ ์๋ก ๋ณํํ๊ธฐ
n = np.ones(5)
t = torch.from_numpy(n)
- NumPy ๋ฐฐ์ด์ ๋ณ๊ฒฝ ์ฌํญ์ด ํ ์์ ๋ฐ์๋ฉ๋๋ค.
np.add(n, 1, out=n)
print(f"t: {t}")
print(f"n: {n}")
t: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
n: [2. 2. 2. 2. 2.]
๋ฐ์ํ
'๐ฅ PyTorch' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[PyTorch] ๋ชจ๋ธ ๋งค๊ฐ๋ณ์ ์ต์ ํ(Optimization) ํ๊ธฐ (0) | 2024.07.30 |
---|---|
[PyTorch] Torch.Autograd๋ฅผ ์ด์ฉํ ์๋ ๋ฏธ๋ถ (0) | 2024.07.30 |
[PyTorch] Neural Network Model (์ ๊ฒฝ๋ง ๋ชจ๋ธ) ๊ตฌ์ฑํ๊ธฐ (0) | 2024.07.26 |
[PyTorch] Transform (๋ณํ) (0) | 2024.07.26 |
[PyTorch] Dataset & DataLoader with CIFAR-10 (0) | 2024.07.26 |