์ฝ๋ฉ์์ ํ์ดํ ์น ์คํ๋ฐฉ๋ฒ๊ณผ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ , ๋ฐํ์์ ์ ํ์ ๋ณ๊ฒฝํด์ค๋๋ค. ์๋จ ๋ฉ๋ด์์ [๋ฐํ์]->[๋ฐํ์์ ํ๋ณ๊ฒฝ]->[ํ๋์จ์ด๊ฐ์๊ธฐ]->[GPU]๋ก ๋ณ๊ฒฝ ์ดํ ์๋์ cell์ ์คํ ์์ผฐ์ ๋, torch.cuda.is_avialable() ๊ฐ์ด True๊ฐ ๋์์ผ ํฉ๋๋ค.
import torch
print(torch.__version__)
print(torch.cuda.is_available())
import matplotlib.pyplot as plt
import numpy as np
import scipy as sp
np.set_printoptions(precision=3)
np.set_printoptions(suppress=True)
PyTorch์์๋ ํ ์๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ, ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ํ๋ ๋๋ค. ํ ์๋ฅผ ๋ฐฐ์ด, ํ๋ ฌ๊ณผ ์ ์ฌํ ์ ์ ๋ง์ด ๊ฐ์ง๊ณ ์์ต๋๋ค. GPU๋ ๋ค๋ฅธ ์ฐ์ฐ ๊ฐ์์ ์ํ ํน์ํ ํ๋์จ์ด์์ ์คํํ ์ ์๋ค๋ ์ ์ ์ ์ธํ๋ฉด, ํ ์๋ NumPy์ ndarray์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
ํ ์ ์ด๊ธฐํํ๊ธฐ: ๋ฐ์ดํฐ๋ก๋ถํฐ ์ง์ ์์ฑํ๊ธฐ
data = [[1, 2],[3, 4]]
x = torch.tensor(data)
x
Numpy array๋ก๋ถํฐ ์์ฑํ๊ธฐ
np_array = np.array(data)
x = torch.from_numpy(np_array)
x
Tensor์์ Numpy array๋ก ๋ณํํ๊ธฐ
x.numpy()
๋ค๋ฅธ ํ
์์ ๊ฐ์ ๋ชจ์์ ํ
์ ์ด๊ธฐํํ๊ธฐ
x_ones = torch.ones_like(x) # x_data์ ์์ฑ์ ์ ์งํฉ๋๋ค.
print(f"Ones Tensor: \n {x_ones} \n")
x_rand = torch.rand_like(x, dtype=torch.float) # x_data์ ์์ฑ์ ๋ฎ์ด์๋๋ค.
print(f"Random Tensor: \n {x_rand} \n")
์ฃผ์ด์ง shape์ผ๋ก ์ด๊ธฐํํ๊ธฐ
shape = (3,4)
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}")
tensor = torch.rand(3,4)
print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")
์๋์ ๊ฐ์ด cpu์ ํ ๋น๋์ด ์๋ tensor๋ฅผ gpu์ ์ฎ๊ธธ ์ ์์ต๋๋ค.
device = torch.device('cuda')
tensor = tensor.to(device)
print(f"Device tensor is stored on: {tensor.device}")
ํ ์ ์ฐ์ฐ
Numpy์์ ์ธ๋ฑ์ฑ๊ณผ ์ฌ๋ผ์ด์ฑ
tensor = torch.ones(3, 4)
tensor[:,1] = 0
print(tensor)
ํ ์ ํฉ์น๊ธฐ
t1 = torch.cat([tensor, tensor, tensor], dim=0)
print(t1)
t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)
ํ
์ ๊ณฑํ๊ธฐ
# ์์๋ณ ๊ณฑ(element-wise product)์ ๊ณ์ฐํฉ๋๋ค
print(f"tensor.mul(tensor) \n {tensor.mul(tensor)} \n")
# ๋ค๋ฅธ ๋ฌธ๋ฒ:
print(f"tensor * tensor \n {tensor * tensor}")
ํ
์๊ฐ matrix multiplication ์งํํ๊ธฐ
print(f"tensor.matmul(tensor.T) \n {tensor.matmul(tensor.T)} \n")
# ๋ค๋ฅธ ๋ฌธ๋ฒ:
print(f"tensor @ tensor.T \n {tensor @ tensor.T}")
PyTorch์๋ torch.autograd๋ผ๊ณ ๋ถ๋ฆฌ๋ ์๋ ๋ฏธ๋ถ ์์ง์ด ๋ด์ฅ๋์ด ์์ต๋๋ค. ์ด๋ ๋ชจ๋ node์ ๋ํ ๋ฏธ๋ถ ๊ฐ์ ์๋์ผ๋ก ๊ณ์ฐํด์ฃผ๊ฒ ๋ฉ๋๋ค. ์ ๋ ฅ X, ํ๋ผ๋ฏธํฐ W , ๊ทธ๋ฆฌ๊ณ cross-entropy loss๋ฅผ ์ฌ์ฉํ๋ logistic regression model์ gradient๋ฅผ autograd๋ฅผ ์ด์ฉํด์ ๊ตฌํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
x = torch.ones(5) # input tensor
y = torch.zeros(3) # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
print(x)
print(y)
print(w)
print(b)
z = torch.matmul(x,w)+b
z
Loss Function
PyTorch์์๋ node๋ฅผ ํฌ๊ฒ 2๊ฐ์ง์ ๋ฐฉ๋ฒ์ api๋ฅผ ํ์ฉํด์ ์ฌ์ฉํฉ๋๋ค.
torch.nn
torch.nn.functional
torch.nn์ ์ฌ์ ์ node๋ฅผ ์ด๊ธฐํ ์์ผ๋๊ณ , ํด๋น node์ ํ
์๋ฅผ ํต๊ณผ์์ผ ๊ฐ์ ๋ฐ๋ ํํ์ธ ๋ฐ๋ฉด, torch.nn.functional์ ์ฌ์ ์ ์ด๊ธฐํ์์ด ๋ฐ๋ก ํจ์์ฒ๋ผ ์ฌ์ฉํ๋ ๋ฐฉ์์
๋๋ค. ์ํ์๋ api๋ฅผ ์ ํํ์
์ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
loss_fn = torch.nn.BCEWithLogitsLoss()
loss = loss_fn(z, y)
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)
Backward
๋ชจ๋ธ์์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ค์น๋ฅผ ์ต์ ํํ๋ ค๋ฉด ํ๋ผ๋ฏธํฐ์ ๋ํ loss function์ ๋ํจ์(derivative)๋ฅผ ๊ณ์ฐํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๋ํจ์๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด, loss.backward() ๋ฅผ ํธ์ถํ ๋ค์ w.grad์ b.grad์์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค
loss.backward()
print(x.grad)
print(w.grad)
print(b.grad)
๊ธฐ๋ณธ์ ์ผ๋ก, requires_grad=True์ธ ๋ชจ๋ ํ ์๋ค์ ์ฐ์ฐ ๊ธฐ๋ก์ ์ถ์ ํ๊ณ ๋ฏธ๋ถ ๊ณ์ฐ์ ์ง์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ธ์ ํ์ตํ ๋ค ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋จ์ํ ์ ์ฉํ๊ธฐ๋ง ํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด forward ์ฐ์ฐ๋ง ํ์ํ ๊ฒฝ์ฐ์๋, ๋ฏธ๋ถ ์ฐ์ฐ์ ์ํ ๊ฐ๋ค์ ์ ์ฅํด๋๋ ๊ฒ์ด ์๋ ฅ ๋ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ํ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ฐ์ฐ ์ฝ๋๋ฅผ torch.no_grad() ๋ธ๋ก์ผ๋ก ๋๋ฌ์ธ์ ๋ฏธ๋ถ ์ถ์ ์ ๋ฉ์ถ ์ ์์ต๋๋ค:
z = torch.matmul(x, w)+b
print(z.requires_grad)
with torch.no_grad():
z = torch.matmul(x, w)+b
print(z.requires_grad)
'๋ฅ๋ฌ๋ > Today I learned :' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ธ๊ณต์ง๋ฅ ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ์ฒด์งํฅ์ด๋ (0) | 2022.12.16 |
---|---|
์ธ๊ณต์ง๋ฅ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (0) | 2022.12.16 |
๋ํ์ด๋ก 3์ธต ์ ๊ฒฝ๋ง์ ์๋ฐฉํฅ ๊ณ์ฐ ๊ตฌํ (0) | 2022.12.10 |
ํผ์ ํธ๋ก ๊ณผ ์ธ๊ณต์ ๊ฒฝ๋ง 1 (0) | 2022.12.08 |
[๋ฅ๋ฌ๋] ์ํซ์ธ์ฝ๋ฉ, ์ํํธ๋งฅ์ค, ๋ชฉ์ ํจ์, ๋ฉํธ๋ฆญ, fit (0) | 2022.07.24 |