Week 1 ํ์ต ์ ๋ฆฌ
Day 1
1. Pytorch Intro
Pytorch
๊ฐํธํ ๋ฅ๋ฌ๋ API๋ฅผ ์ ๊ณต, ํ์ฅ์ฑ์ด ๋ฐ์ด๋ ๋ฉํฐํ๋ซํผ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค
API : ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋ก ์ํธ์์ฉํ๋๋ฐ ์ฌ์ฉํ๋ ๋ช ๋ ค์ด, ํจ์, ํ๋กํ ์ฝ์ ์งํฉ, ์ฆ ๋ฅ๋ฌ๋์ ๊ฐ๋ฐํ ๋, Pytorch๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ ๊ณตํ๋ ์ธํฐํ์ด์ค
Pytorch ์ํคํ
์ฒ
Tensor
Pytorch์์ ์ฌ์ฉํ๋ ํต์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ, Numpy์ ๋ค์ฐจ์ ๋ฐฐ์ด๊ณผ ์ ์ฌํจ.
- 0-D Tensor : Scalar, ํ๋์ ์ซ์๋ก ํํ
- 1-D Tensor : Vector, ์์๊ฐ ์ง์ ๋ ์ฌ๋ฌ ๊ฐ์ ์ซ์๋ค์ด ์ผ๋ ฌ๋ก ๋์ด๋ ๊ตฌ์กฐ
- 2-D Tensor : 1-D Tensor๊ฐ ๋ชจ์ฌ ํ๊ณผ ์ด๋ก ๊ตฌ์ฑ๋ 2์ฐจ์ ๊ตฌ์กฐ
- 3-D Tensor : 2-D Tensor๋ฅผ ๋ชจ์ ํ, ์ด, ์ฑ๋๋ก ๊ตฌ์ฑ๋ 3์ฐจ์ ๊ตฌ์กฐ
- N-D Tensor(N โฅ 4 ) : (N-1)-D Tensor๋ค์ด ์ฌ๋ฌ ๊ฐ ๋ชจ์ฌ ํ์ฑ๋ N์ฐจ์ ๊ตฌ์กฐ
2. Pytorch์ ๋ฐ์ดํฐ ํ์
Pytorch์ ๋ฐ์ดํฐ ํ์ == Tensor๊ฐ ์ ์ฅํ๋ ๋ฐ์ดํฐ ์ ํ
- ์ ์ํ : ์์ ๋ถ๋ถ์ด ์๋ ์ซ์๋ฅผ ์ ์ฅํ๋ ๋ฐ์ดํฐ ํ์ unsigned - ๋ถํธ๊ฐ ์๋ ์ ํ (ex. uint8 โ 8๋นํธ ๋ชจ๋ ์ซ์๋ก ํํ (0~255))signed - ๋ถํธ๊ฐ ์๋ ์ ํ (ex. int8 โ ๋งจ ์์ 1bit๋ ๋ถํธ ํํ(0 = ์์, 1 = ์์), ๋๋จธ์ง 7bit๋ก ์ซ์ ํํ(-128~127))
- ์ค์ํ : 32, 64 bit ๋ถ๋ ์์์ ์์ ์ ํ์ผ๋ก ๊ตฌ๋ถํจ, ์ ๊ฒฝ๋ง ์์น ๊ณ์ฐ์ ์ฌ์ฉ๋ถ๋ ์์์ ์ : ์ซ์๋ฅผ ์ ๊ทํํ์ฌ ๊ฐ์๋ถ์ ์ง์๋ถ๋ก ๋๋์ด ํํ32bit = torch.float32, torch.float / 64bit = torch.float64, torch.double
ํ์ ์บ์คํ
ํ ๋ฐ์ดํฐ ํ์ ์ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ๋ณํํ๋ ๊ฒ
# Tensor ์์ฑ
i = torch.tensor([2,3,4], dtype = torch.int8)
# 32bit ๋ถ๋ ์์์ ์๋ก ๋ณํ
j = i.float()
# 64bit ๋ถ๋ ์์์ ์๋ก ๋ณํ
k = i.double()
3. Tensor์ ๊ธฐ์ด ํจ์ ๋ฐ ๋ฉ์๋
torch.min("tensor")# tensor์ ์ต์๊ฐ ๋ฐํ
torch.max("tensor")# tensor์ ์ต๋๊ฐ ๋ฐํ
torch.sum("tensor")# tensor์ ์์์ ํฉ ๋ฐํ
torch.prod("tensor")# tensor์ ์์์ ๊ณฑ ๋ฐํ
torch.mean("tensor")# tensor์ ์์์ ํ๊ท ๋ฐํ
torch.var("tensor")# tensor์ ์์์ ํ๋ณธ๋ถ์ฐ ๋ฐํ
torch.std("tensor")# tensor์ ์์์ ํ๋ณธํ์คํธ์ฐจ ๋ฐํ# tensor T๊ฐ ์์ ๋
T.dim()# T์ ์ฐจ์ ์๋ฅผ ํ์ธ
T.size()# T์ ํฌ๊ธฐ๋ฅผ ํ์ธ
T.shape# T์ ํฌ๊ธฐ๋ฅผ ํ์ธ(๋ฉ์๋๊ฐ ์๋ ์์ฑ)
T.numel()# T์ ์๋ ์์์ ์ด ๊ฐ์ ํ์ธ
Day 2
1. Tensor์ ์์ฑ
# 0 or 1๋ก ์ด๊ธฐํ ํ ์์ฑ
torch.zeros("shape")# shape ํฌ๊ธฐ์ Tensor๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ์ฌ ์์ฑ
torch.ones("shape")# shape ํฌ๊ธฐ์ Tensor๋ฅผ 1๋ก ์ด๊ธฐํํ์ฌ ์์ฑ
torch.ones_liskes("tensor")# tensor์ ํฌ๊ธฐ์ ์๋ฃํ์ด ๊ฐ์ Tensor๋ฅผ 1๋ก ์ด๊ธฐํ# random์ผ๋ก ์ด๊ธฐํ
torch.rand("shape")# shape ํฌ๊ธฐ์ Tensor๋ฅผ 0~1์ฌ์ด์ ์ฐ์๊ท ๋ฑ๋ถํฌ ๊ฐ์ผ๋ก ์ด๊ธฐํ ํ ์์ฑ
torch.randn("shape")# shape ํฌ๊ธฐ์ Tensor๋ฅผ ํ๊ท :1, ๋ถ์ฐ:1์ ํ์ค์ ๊ท๋ถํฌ ๊ฐ์ผ๋ก ์ด๊ธฐํ ํ ์์ฑ# rand -> randn
torch.rand_like(k)# k์ ํฌ๊ธฐ์ ์๋ฃํ์ด ๊ฐ์ ์ฐ์๊ท ๋ฑ๋ถํฌ Tensor๋ก ์์ฑ
torch.randn_like(k)# k์ ํฌ๊ธฐ์ ์๋ฃํ์ด ๊ฐ์ ํ์ค์ ๊ท๋ถํฌ Tensor๋ก ์์ฑ# ์ผ์ ๊ฐ๊ฒฉ์ ๊ฐ์ ๊ฐ์ง Tenssor ์์ฑ
torch.arange(start = 1, end = 11, step = 2)# 1๋ถํฐ 10๊น์ง 2์ฉ ์ฆ๊ฐํ๋ Tensor ์์ฑ
- ์ฐ์์ ๊ท๋ถํฌ: ๋ชจ๋ ๊ฐ์ด ๋์ผํ ํ๋ฅ ์ ๊ฐ์ง๋ ํ๋ฅ ๋ถํฌ
- ํ์ค์ ๊ท๋ถํฌ:ย ํ๊ท ์ด 0์ด๊ณ ํ์คํธ์ฐจ๊ฐ 1์ธ ์ข ๋ชจ์์ ๊ณก์ ์ ๊ฐ์ง๋ ํ๋ฅ ๋ถํฌ
- ์ด๊ธฐํ ๋์ง ์์ Tensor: ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ฑ์์ง ์์ ์ด๋ผ๋ฉด ์ด๊ธฐ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ด ๋ถํ์ํ๋คย โ ์ด๊ธฐํ ํ์ง ์๋๋ค.๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ๋์ผ ์ ์๋ค.์ค์ ๋ก ๋น์ด์๋ ๊ฒ์ ์๋๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ ์์์ ๊ฐ์ผ๋ก ์ฑ์์ง
torch.empty("shape")# shape ํฌ๊ธฐ์ ์ด๊ธฐํ ๋์ด ์์ง ์์ Tensor ์์ฑ
tensor.fill_("value")# value ๊ฐ์ผ๋ก tensor๋ฅผ ์ฑ์
- List, Numpy๋ก Tensor ์์ฑNumpy : C์ธ์ด๋ก ๊ตฌํ๋ Python ํต์ฌ ๊ณผํ ์ปดํจํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋ฐฐ์ด์ ํจ์จ์ ์ผ๋ก ์กฐ์ํ ์ ์๋ค.
s = [1, 2, 3, 4, 5, 6]
torch.tensor(s)# ๋ฐฐ์ด s๋ก Tensor ์์ฑ
u = np.array([[0, 1], [2, 3]])
v = torch.from_Numpy(u)# Numpy ๋ฐฐ์ด์ Tensor๋ก ๋ณํ
v = torch.from_Numpy(u).float()# Numpy๋ ๊ธฐ๋ณธ ์ ์ํ์ด๋ผ์ ์ค์ํ์ผ๋ก ํ์
์บ์คํ
- ์ฌ๋ฌ ์๋ฃํ์ผ๋ก Tensor ์์ฑtorch.(์๋ฃํ)Tensor ํํ๋ก ์ฌ์ฉํจ
torch.ByteTensor()# 8๋นํธ ๋ถํธ ์๋ ์ ์ํ CPU Tensor ์์ฑ
torch.CharTensor()# 8๋นํธ ๋ถํธ ์๋ ์ ์ํ CPU Tensor ์์ฑ
torch.ShortTensor()# 16๋นํธ ๋ถํธ ์๋ ์ ์ํ CPU Tensor ์์ฑ
torch.FloatTensor()
torch.IntTensor()
torch.LongTensor()# 64๋นํธ ๋ถํธ ์๋ ์ ์ํ CPU Tensor ์์ฑ
torch.DoubleTensor()# 64๋นํธ ๋ถํธ ์๋ ์ค์ํ CPU Tensor ์์ฑ
2. Tensor์ ๋ณต์
3. CUDA Tensor ์์ฑ ๋ฐ ๋ณํ
tensor.device# tensor๊ฐ ์ด๋์ ์๋์ง ํ์ธ
torch.cuda.is_available()# cuda๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ํ์ธ
torch.cuda.get_device_name(device=0)# cuda ์ด๋ฆ์ ํ์ธ ex. NVIDIA GeForce GTX 1080
tensor.cuda() or tensor.to('cuda')# tensor๋ฅผ GPU๋ก ์ด๋
4. Tensor์ Indexing๊ณผ Slicing
Numpy ์์์ ์ธ๋ฑ์ฑ๊ณผ ์ฌ๋ผ์ด์ฑ๊ณผ ์ ์ฌํ๋ค.
indexing : Tensor์ ํน์ ์์น์ ์์์ ์ ๊ทผํ๋๊ฒ
slicing : ๋ถ๋ถ์งํฉ์ ์ ํํ์ฌ ์๋ก์ด Sub Tensor ์์ฑ
5. Tensor ๋ชจ์ ๋ณ๊ฒฝ
tensor.view("shape")
Tensor๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ผ๋ก ์ ์ฅ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ๊ฐ๋ฅ
tensor.is_contiguous()# tensor๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ธ์ง ์๋์ง ์๋ ค์ค
torch.flatten("tensor") or tensor.flatten()
Tensor๊ฐ ๋ค์ฐจ์์ธ ๊ฒฝ์ฐ ํํํํ ๋ ์ฌ์ฉ๊ฐ๋ฅ, ๋ค์ฐจ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ ์ฉ
torch,flatten(k, 1)# 1์ฐจ์๊ณผ ๊ฐ์ด ํน์ ์ฐจ์๋ถํฐ ํํํ ๊ฐ๋ฅ
torch,flatten(k, 0, 1)# 0์ฐจ์ ๋ถํฐ 1์ฐจ์๊น์ง ํน์ ์ฐจ์ ๋ฒ์๋ง ํํํ ๊ฐ๋ฅ
tensor.reshape("shape")
view์ ๋ค๋ฅด๊ฒ Tensor๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ด์ง ์์๋ ์ฌ์ฉ๊ฐ๋ฅ, ์์ ํ๊ณ ์ ์ฐํ์ง๋ง ์ฑ๋ฅ์ด ์ ํ๋จ
๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฐ์์ ์ธ๊ฒ ํ์คํ๊ณ ์ฑ๋ฅ์ด ์ค์ํ๋ฉด view๋ฅผ ์ฌ์ฉ, ์๋๋ผ๋ฉด reshape๋ฅผ ์ฌ์ฉ
tensor.transpose("dim1", "dim2")
dim1๊ณผ dim2์ ์ถ์ ๋ฐ๊พผ๋ค.torch.squeeze("tensor")
tensor๋ด์ ์ฐจ์์ ๊ฐ์ด 1์ธ ์ฐจ์์ ์ถ์ํ๋ค. ex) [1, 2, 3]ย โ [2, 3]squeeze(dim = 1) โ ํน์ ์ฐจ์์ด 1์ผ ๋๋ง ์ถ์๋๋๋ก ์ค์ ๊ฐ๋ฅtorch.unsqueeze("tensor", dim = n)
tensor๋ด์ n์ฐจ์์ ๊ฐ์ 1๋ก ํ์ฅํ๋ค. ex) dim=0์ผ๋ [2, 3] โ [1, 2, 3]torch.stack(("tensor1", "tensor2", ... ), dim=n)
dim์ default๊ฐ์ 0์ด๊ณ dim์ถ์ ๊ธฐ์ค์ผ๋ก tensor๋ค์ ์์์ฌ๋ฆฐ๋ค.tensor์ ํฌ๊ธฐ๊ฐ ๋ชจ๋ ๊ฐ์์ผ ์ฌ์ฉํ ์ ์๋ค.์๋ก์ด ์ฐจ์์ ์์ฑํด์ ๊ฒฐํฉํ๋ค.R, G, B ์ฑ๋์ ์์ ์ปฌ๋ฌ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ ๋ค๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
Day 3
1. Tensor์ ๋ชจ์ ๋ณ๊ฒฝ 2
torch.cat(("tensor1", "tensor2"), dim=0)
stackํจ์์ ๋ค๋ฅด๊ฒ ์๋ก์ด ์ฐจ์์ด ์๋๋ผ ๊ธฐ์กด์ ์ฐจ์์ ์ ์งํ๋ฉด์ Tensor๋ฅผ ์ฐ๊ฒฐํจtensor.expand("shape")
f = (1,3)์ผ๋ g = f.expand(4,3)์ ํ๋ฉด g์๋ (4,3)์ ํ ์๊ฐ ์ ์ฅ๋จTensor ์ฐจ์ ์ค ํ๋๋ผ๋ ํฌ๊ธฐ๊ฐ 1์ด์ด์ผํ๋ ์ ์ฝ์ด ์์, ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์์ด ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑโtensor.repeat("๋ฐ๋ณตํ์ 1", "๋ฐ๋ณตํ์ 2")
tensor๋ฅผ dim=0์ถ์ผ๋ก ๋ฐ๋ณตํ์ 1๋งํผ ๋ฐ๋ณต, dim=1์ถ์ผ๋ก ๋ฐ๋ณตํ์ 2๋งํผ ๋ฐ๋ณตTensor์ ์ฐจ์ ์ค ํ๋๋ผ๋ ํฌ๊ธฐ๊ฐ 1์ด์ด์ผํจ, ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑโ
2. Tensor์ ๊ธฐ์ด ์ฐ์ฐ
-
๋ํ๊ธฐ ์ฐ์ฐ ๋ Tensor๋ฅผ ์์๋ณ๋ก ๋ํ๋ ์ฐ์ฐ, ๋ Tensor์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ฉด ๋ธ๋ก๋ ์บ์คํ ํ์ฌ ์งํ
torch.add(tensor1, tensor2)
- in-place ๋ฐฉ์ : ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๋ฉฐ Tensor์ ๊ฐ์ ์
๋ฐ์ดํธ ํ ์ ์๋ ์ฐ์ฐ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ํ์ ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ผ ์ ์๋ค. ํ์ง๋ง Autograd์์ ํธํ์ฑ์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
tensor1.add_(tensor2)
- in-place ๋ฐฉ์ : ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๋ฉฐ Tensor์ ๊ฐ์ ์
๋ฐ์ดํธ ํ ์ ์๋ ์ฐ์ฐ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ํ์ ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ผ ์ ์๋ค. ํ์ง๋ง Autograd์์ ํธํ์ฑ์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
-
๋นผ๊ธฐ ์ฐ์ฐ ๋ Tensor์ ์์๋ณ๋ก ๋นผ๋ ์ฐ์ฐ, ๋ Tensor์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ฉด ๋ธ๋ก๋ ์บ์คํ ํ์ฌ ์งํ ์ผ๋ฐ :
torch.sub(tensor1, tensor2)
in-place :tensor1.sub_(tensor2)
-
์ค์นผ๋ผ ๊ณฑ ํ๋์ Tensor์ ๊ฐ ์์์ ๋์ผํ ๊ฐ์ ๊ณฑํ๋ ์ฐ์ฐ
torch.mul(salar_value, tensor)
-
์์๋ณ ๊ณฑํ๊ธฐ ์ฐ์ฐ (element-wise product) ๋ Tensor์ ์์๋ณ๋ก ๊ณฑํ๋ ์ฐ์ฐ, ๋ Tensor์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ฉด ๋ธ๋ก๋ ์บ์คํ ํ์ฌ ์งํ
์ผ๋ฐ :
torch.mul(tensor1, tensor2)
in-place :tensor1.mul_(tensor2)
-
์์๋ณ ๋๋๊ธฐ ์ฐ์ฐ ๋ Tensor์ ์์๋ณ๋ก ๋๋๋ ์ฐ์ฐ, ๋ Tensor์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ฉด ๋ธ๋ก๋ ์บ์คํ ํ์ฌ ์งํ
์ผ๋ฐ :
torch.div(tensor1, tensor2)
in-place :tensor1.div_(tensor2)
-
์์๋ณ ๊ฑฐ๋ญ์ ๊ณฑ ์ฐ์ฐ Tensor1์ ์์์ ๊ฐ๊ฐ Tensor2์ ๊ฐ๋งํผ ๊ฑฐ๋ญ์ ๊ณฑํ๋ ์ฐ์ฐ, ๋ Tensor์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ฉด ๋ธ๋ก๋ ์บ์คํ ํ์ฌ ์งํ ์ผ๋ฐ :
torch.pow(tensor1, tensor2)
in-place :tensor1.pow_(tensor2) torch.pow(tensor1, 1/n)
โ n์ ๊ณฑ๊ทผ์ ๊ณ์ฐํ๋ ์ฝ๋ -
๋น๊ต์ฐ์ฐ
torch.eq(v, w)
๋ฅผ ์ด์ฉํด ๋ tensor์ ๋์์์๊ฐ ๊ฐ์์ง boolean tensor๋ก ์ถ๋ ฅtorch.ne(v, w)
๋ฅผ ์ด์ฉํด ๋ tensor์ ๋์์์๊ฐ ๋ค๋ฅธ์ง boolean tensor๋ก ์ถ๋ ฅ๋์์์๋ค๋ณด๋ค ํฐ์ง๋ฅผ ๋น๊ตํ๋ ์ฝ๋ ํํ:
torch.gt(v, w)
๋์์์๋ค๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์์ง๋ฅผ ๋น๊ตํ๋ ์ฝ๋ ํํ:torch.ge(v, w)
Tensor v์ ์์๋ค์ด Tensor w์ ๋์์์๋ค๋ณด๋ค ์์์ง๋ฅผ ๋น๊ตํ๋ ์ฝ๋ ํํ:
torch.lt(v, w)
Tensor v์ ์์๋ค์ด Tensor w์ ๋์์์๋ค๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์ง๋ฅผ ๋น๊ตํ๋ ์ฝ๋ ํํ:torch.le(v, w)
-
๋ ผ๋ฆฌ ์ฐ์ฐ AND ์ฐ์ฐ -
torch.logical_and(x, y)
OR ์ฐ์ฐ -torch.logical_or(x, y)
XOR ์ฐ์ฐ -torch.logical_xor(x, y)
3. Tensor์ ๋ ธ๋ฆ
1-D Tensor์ ๋ ธ๋ฆ์ Vector๊ฐ ์์ ์์ ์ผ๋ง๋ ๋จ์ด์ ธ ์๋์ง๋ฅผ ์๋ฏธํจ Vector์ ๊ธธ์ด๋ฅผ ์ธก์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ๋จ
- L1 norm 1-D Tensor์ ํฌํจ๋ ์์์ ์ ๋๊ฐ์ ํฉ์ผ๋ก ์ ์, ๋งจํดํผ norm์ด๋ผ๊ณ ๋ ๋ถ๋ฆ ์ฝ๋ :
torch.norm(a, p=1)
p๋ L1์ธ์ง L2์ธ์ง๋ฅผ ์ ๋ ฅ
-
L2 norm 1-D Tensor์ ํฌํจ๋ ์์์ ์ ๊ณฑํฉ์ ์ ๊ณฑ๊ทผ์ผ๋ก ์ ์, ์ ํด๋ฆฌ๋์ norm์ด๋ผ๊ณ ๋ ๋ถ๋ฆ
์ฝ๋ :
torch.norm(a, p=2)
-
Lโ norm 1-D Tensor์ ํฌํจ๋ ์์์ ์ ๋๊ฐ ์ค ์ต๋๊ฐ์ผ๋ก ์ ์,
์ฝ๋ :
torch.norm(a, p=float('inf'))
4. ์ ์ฌ๋
์ ์ฌ๋(Similarity)๋ ๋ 1-D Tensor(=Vector)๊ฐ ์ผ๋ง๋ ์ ์ฌํ์ง์ ๋ํ ์ธก์ ๊ฐ์ ์๋ฏธ
-
๋งจํดํผ ์ ์ฌ๋ ๋ 1-D Tensor ์ฌ์ด์ ๋งจํดํผ ๊ฑฐ๋ฆฌ๋ฅผ ์ญ์๋ก ๋ณํํ์ฌ ๊ณ์ฐํ ๊ฐ ๋งจํดํผ ๊ฑฐ๋ฆฌ์ ๊ฐ์ด ์์์ง ์๋ก ๋งจํดํผ ์ ์ฌ๋์ ๊ฐ์ ์ปค์ง 1์ ๊ฐ๊น์ธ์๋ก ๋ Tensor๊ฐ ์ ์ฌ
manhattan_distance = torch.norm(b โ c, p = 1) โ 1 / (1 + manhattan_distance)
-
์ ํด๋ฆฌ๋ ์ ์ฌ๋ ๋ 1-D Tensor ์ฌ์ด์ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ญ์๋ก ๋ณํํ์ฌ ๊ณ์ฐํ ๊ฐ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ์ ๊ฐ์ด ์์์ง ์๋ก ๋งจํดํผ ์ ์ฌ๋์ ๊ฐ์ ์ปค์ง 1์ ๊ฐ๊น์ธ์๋ก ๋ Tensor๊ฐ ์ ์ฌ
euclidean_distance = torch.norm(b โ c, p = 2) โ 1 / (1 + euclidean_distance)
- ์ฝ์ฌ์ธ ์ ์ฌ๋ ๋ 1-D Tensor ์ฌ์ด์ ๊ฐ๋๋ฅผ ์ธก์ ํ์ฌ ๊ณ์ฐํ ๊ฐ ์ฝ์ฌ์ธ ์ ์ฌ๋์ ๊ฐ์ด 1์ ๊ฐ๊น์ธ ์๋ก ๋ Tensor๊ฐ ์ ์ฌ 1-D Tensor(=Vector)์ **๋ด์ (dot product ๋๋ inner product)**์ ํ์ฉํ์ฌ ๊ณ์ฐ
cosine_similarity = torch.dot(b, c) / (torch.norm(b, p = 2) * (torch.norm(c, p = 2))
-
๋ด์
torch.dot(b, c)
- ๋ 1-D Tensor์ ๊ฐ ์์๋ฅผ ๊ณฑํด์ ๋ํ๋ ๋ฐฉ๋ฒ
- ๋ 1-D Tensor์ ๊ธธ์ด๋ฅผ ๊ณฑํ๋ ๋ฐฉ๋ฒ
-
์ฝ์ฌ์ธ ์ ์ฌ๋ ์์ํํ ์ ๋
-
5. 2-D ํ๋ ฌ ๊ณฑ์ ์ฐ์ฐ
์ฝ๋ ํํ : D.matmul(E)
, D.mm(E)
, D @ E
ํ๋ ฌ ๊ณฑ์
์ ํตํด ์ข์ฐ ๋์นญ์ด๋์ด ๊ฐ๋ฅํ๋ค โ
๊ทธ๋ ๋ค๋ฉด ํ๋ฐฑ ์ด๋ฏธ์ง์ ์ํ๋ก ๋์นญ ์ด๋์ ์ด๋ค ์ถ์ ๊ธฐ์ค์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ค์ง๋ ๋ณํ์ผ๊น์?
-
์ ๋ต
x ์ถ์ ๊ธฐ์ค์ผ๋ก ๋ค์ง๋ ๋ณํ
๋ํ, ํ๋ฐฑ ์ด๋ฏธ์ง๋ฅผ ์ํ๋ก ๋์นญ ์ด๋์ํค๊ธฐ ์ํด์๋ ์ด๋ค ํ๋ ฌ์ ์ด๋ป๊ฒ ๊ณฑ์ ํด์ผ ํ ๊น์?
-
์ ๋ต
* ํ๋ฐฑ ์ด๋ฏธ์ง ํ๋ ฌ
Day 4
1. ์ ํ ํ๊ท ๋ชจ๋ธ
1.1 ์ ํ ํ๊ท์ ์๋ฏธ
- ์ ์: ์ ํ ํ๊ท๋ ์ฃผ์ด์ง ํธ๋ ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ**(1)** ํน์ง ๋ณ์์ ๋ชฉํ ๋ณ์ ์ฌ์ด์ ์ ํ ๊ด๊ณ๋ฅผ ๋ถ์ํ๊ณ **(2), ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ชจ๋ธ์ ํ์ต์์ผ(3)** ์๋ก์ด ๋ฐ์ดํฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์์ ์ธ ์ซ์ ๊ฐ์ผ๋ก ์์ธกํ๋ ๊ณผ์ ์ ๋๋ค.(4)
- ํ์ฉ ์์:
- ์๊ธ ์์ธก: ์ฐ์ฐจ์ ๋ฐ๋ฅธ ์ฐ๋ด ์์ธก
- ๋ถ๋์ฐ ๊ฐ๊ฒฉ ์์ธก: ์ฃผํ์ ๋ฐฉ ๊ฐ์, ๊ต์ก ํ๊ฒฝ, ๋ฒ์ฃ์จ ๋ฑ์ ๋ฐ๋ฅธ ์ฃผํ ๊ฐ๊ฒฉ ์์ธก
1.2 ํธ๋ ์ด๋ ๋ฐ์ดํฐ
-
ํธ๋ ์ด๋ ๋ฐ์ดํฐ ์ ์: ํธ๋ ์ด๋ ๋ฐ์ดํฐ๋ ๋ชจ๋ธ์ ํ์ต์ํค๊ธฐ ์ํด ํ์ํ ๋ฐ์ดํฐ๋ก, ์์๋ก
YearsExperience
(์ฐ์ฐจ)์Salary
(์๊ธ)์ ๊ด๊ณ๋ฅผ ๋ํ๋ธ ๋ฐ์ดํฐ์ ์ด ์ฌ์ฉ๋ฉ๋๋ค. -
ํน์ง ๋ณ์์ ๋ชฉํ ๋ณ์:
- ํน์ง ๋ณ์:
YearsExperience
(์ฐ์ฐจ) โ ์์ธกํ ํ๊ธฐ ์ํ ๋ณ์- ๋ชฉํ ๋ณ์:
Salary
(์๊ธ) โ ์์ธกํ ๋ณ์
- ๋ชฉํ ๋ณ์:
- ํน์ง ๋ณ์:
-
์ฝ๋ ์์:
- Kaggle์์ ๋ฐ์ดํฐ์ ์ ๋ค์ด๋ก๋ํ๊ณ ์ด๋ฅผ ๋ถ๋ฌ์ค๋ ์ฝ๋๋ฅผ ํฌํจํ์ฌ ์ค๋ช ํฉ๋๋ค.
!kaggle datasets download โd abhishek14398/salary-dataset-simple-linear-regression !unzip salary-dataset-simple-linear-regression.zip data = pd.read_csv(โSalary_dataset.csvโ, sep = โ,โ, header = 0) x = data.iloc[:, 1].values t = data.iloc[:, 2].values
1.3 ์๊ด ๊ด๊ณ ๋ถ์
- ๋ชฉ์ : ํน์ง ๋ณ์์ ๋ชฉํ ๋ณ์ ๊ฐ์ ์ ํ ๊ด๊ณ๋ฅผ ํ์ ํ๊ธฐ ์ํด ์๊ด ๊ด๊ณ๋ฅผ ๋ถ์ํฉ๋๋ค.(2)
- ์๊ด ๊ด๊ณ ๋ถ์:
- ๋ ๋ณ์ ๊ฐ์ ์ ํ ๊ด๊ณ๋ฅผ ํ์ ํ๊ณ , ๊ทธ ๊ด๊ณ๊ฐ ์์ ๊ด๊ณ์ธ์ง ๋๋ ์์ ๊ด๊ณ์ธ์ง๋ฅผ ํ์ ํฉ๋๋ค.
- ๋์ ์๊ด ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ ํน์ง ๋ณ์๋ค์ ํ์ ํฉ๋๋ค. (์ ๋๊ฐ์ด ํด์๋ก ๋์ ์๊ด ๊ด๊ณ)
- ์์ ํํ: ํ๋ณธ ์๊ด ๊ณ์๋ฅผ ํตํด ๋ ๋ณ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ์์์ผ๋ก ๋ํ๋
๋๋ค.
(ํ๋ณธ์๊ด๊ณ์) - ์ฝ๋ ์์:
- ์๊ด ๊ด๊ณ ๋ถ์ ์ฝ๋:
np.corrcoef(x, t)
- ์๊ด ๊ด๊ณ ์๊ฐํ ์ฝ๋:
plt.scatter(x, t)
- ์๊ด ๊ด๊ณ ๋ถ์ ์ฝ๋:
1.4 ์ ํ ํ๊ท ๋ชจ๋ธ์์์ ํ์ต
-
ํ์ต ์ ์: ์ ํ ํ๊ท ๋ชจ๋ธ์์์ ํ์ต์ ์ฃผ์ด์ง ํธ๋ ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฅ ์ ํํํ ์ ์๋ ์ง์
b์ ๊ธฐ์ธ๊ธฐ(๊ฐ์ค์น) ์ ์ ํธ(๋ฐ์ด์ด์ค) -
์ ๊ฒฝ๋ง ๊ด์ ์์์ ์ค๋ช :
- ์ ํ ํ๊ท ๋ชจ๋ธ์ ์ ๋ ฅ์ธต์ ํน์ง ๋ณ์๋ฅผ ์ถ๋ ฅ์ธต์ ์์ธก ๋ณ์๋ก ๋งคํํ๋ ๊ณผ์ ์ผ๋ก ์ค๋ช ๋ฉ๋๋ค.
- ๊ฐ ๋ด๋ฐ์ ๊ฐ์ค์น์ ๋ฐ์ด์ด์ค๋ฅผ ํตํด ์ฐ๊ฒฐ๋๋ฉฐ, ๋ชจ๋ธ์ด ํ์ตํ๋ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
-
PyTorch ๊ตฌํ:
-
nn.Module ํด๋์ค: PyTorch์์ ์ ๊ฒฝ๋ง์ ๋ชจ๋ ๊ณ์ธต์ ์ ์ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค. ์ด๋ฅผ ์์๋ฐ์ ๋ณต์กํ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
-
์ฅ์
์ผ๊ด์ฑ: ๋ชจ๋ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ์ํ๊ณ ์ฌ์ฉํ ์ ์์ ๋ชจ๋ํ: ๋ชจ๋ธ์ ๊ณ์ธต๋ณ๋ก ๋๋์ด ๊ด๋ฆฌํ ์ ์์ด ์ฝ๋๊ฐ ๊น๋ํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ GPU์ง์: ๋๊ท๋ชจ ์ฐ์ฐ์ ๊ฐ์ํํ์ฌ ๋ชจ๋ธ์ ํ์ต ์๋๋ฅผ ๋์ ์๋ ๋ฏธ๋ถ, ์ต์ ํ, ๋๋ฒ๊น ๊ณผ ๋ก๊น
-
-
์ฝ๋ ์์:
python์ฝ๋ ๋ณต์ฌ class LinearRegressionModel(nn.Module): def __init__(self): super(LinearRegressionModel, self).__init__() self.linear = nn.Linear(1, 1) def forward(self, x): y = self.linear(x) return y model = LinearRegressionModel()
-
-
์ค์ฐจ:
- ์ค์ฐจ๋ ๋ชฉํ ๋ณ์
์ ์์ธก ๋ณ์ ์ ์ฐจ์ด๋ฅผ ์๋ฏธํฉ๋๋ค. - ์ ํ ํ๊ท ๋ชจ๋ธ์์๋ ์ค์ฐจ์ ์ดํฉ์ด ์ต์๊ฐ ๋๋๋ก ๊ฐ์ค์น
์ ๋ฐ์ด์ด์ค ๋ฅผ ์ฐพ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ค์ฐจ๋ ๋ชฉํ ๋ณ์
-
์์ค ํจ์:
-
์์ค ํจ์๋ ๋ชฉํ ๋ณ์์ ์์ธก ๋ณ์ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ธก์ ํ๋ ํจ์์ด๋ฉฐ, ์ด๋ฅผ ํตํด ๋ชจ๋ธ์ ์ต์ ํํฉ๋๋ค.
-
ํ๊ท ์ ๊ณฑ ์ค์ฐจ(Mean Squared Error, MSE) ๋ฐฉ์์ด ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
-
์์:
-
๋ชฉ์ ์ ์์์์
์ ๋ฅผ ๋ฐ๊พธ์ด ๊ฐ๋ฉฐ ์์คํจ์๊ฐ ์์์ง๋๋ก ๋ง๋ค์ด์ผํฉ๋๋ค. ์์ค ํจ์์ ๊ฐ์ด ํฌ๋ค๋ฉด ํ๊ท ์ค์ฐจ๊ฐ ํฌ๋ค. ์์ค ํจ์์ ๊ฐ์ด ์์ผ๋ฉด ํ๊ท ์ค์ฐจ๊ฐ ์๋ค. -
์ฝ๋ ์์:
python์ฝ๋ ๋ณต์ฌ loss_function = nn.MSELoss()
-
1.5 ํ์ต ์ ๋ฆฌ
- ์์ฝ:
- ์ ํ ํ๊ท ๋ชจ๋ธ์ ์ฃผ์ด์ง ํธ๋ ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ง ๋ณ์์ ๋ชฉํ ๋ณ์ ์ฌ์ด์ ์ ํ ๊ด๊ณ๋ฅผ ๋ถ์ํ๊ณ , ์ด๋ฅผ ๋ฐํ์ผ๋ก ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๋ ๋ชจ๋ธ์ ๋๋ค.
- ์ ๊ฒฝ๋ง ๊ด์ ์์ ์ ํ ํ๊ท๋ ์ ๋ ฅ์ธต์ ํน์ง ๋ณ์๊ฐ ์ถ๋ ฅ์ธต์ ์์ธก ๋ณ์๋ก ์ฌ์๋๋ ๊ณผ์ ์ด๋ฉฐ, ํ์ต ๊ณผ์ ์์ ์ค์ฐจ๋ฅผ ์ต์ํํ๋ ์ต์ ์ ์ง์ ์ ์ฐพ๋ ๊ฒ์ด ๋ชฉํ์ ๋๋ค.
1. ๊ฒฝ์ฌํ๊ฐ๋ฒ
1.1 ๊ฒฝ์ฌํ๊ฐ๋ฒ
-
๊ฒฝ์ฌํ๊ฐ๋ฒ์ด๋:
- ๊ฒฝ์ฌํ๊ฐ๋ฒ(Gradient Descent Algorithm)์ ๋จธ์ ๋ฌ๋์ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๋ก, ์ฃผ์ด์ง ์์ค ํจ์์์ ๋ชจ๋ธ์ ๊ฐ์ค์น์ ๋ฐ์ด์ด์ค์ ์ต์ ์ ๊ฐ์ ์ฐพ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
-
๊ฐ์ค์น
๊ฐ์ ๋ฐ๋ฅธ ์์ค ํจ์: - ์ฌ๋ฌ ๊ฐ์ค์น
๊ฐ(์: -0.5, 0, 0.5, 1, 1.5)์ ๋ฐ๋ฅธ ์์ค ํจ์ ์ ๊ณ์ฐ์ ํตํด, ๊ฐ์ค์น๊ฐ ์์ค์ ๋ฏธ์น๋ ์ํฅ์ ์์์ผ๋ก ํํํฉ๋๋ค. - ์ด ๊ณผ์ ์์ ๊ฒฝ์ฌ(๊ธฐ์ธ๊ธฐ)์ ๊ฐ๋ ์ด ๋ฑ์ฅํ๋ฉฐ, ์ด๋ ์์ค ํจ์์ ์ต์๊ฐ์ ์ฐพ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
- ํ์ฌ ์์ค ๊ฐ์ ๋ํ ๊ธฐ์ธ๊ธฐ๋ฅผ ์๋ ๋ฏธ๋ถ์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ Pytorch์์๋
loss.backward()
๋ก ๊ตฌํ๋ฉ๋๋ค.
- ์ฌ๋ฌ ๊ฐ์ค์น
-
๊ฒฝ์ฌ์ ์์ ํํ:
- ๊ฒฝ์ฌ๋ ์์ค ํจ์
์ ๋ณํ๋์ ๊ฐ์ค์น ์ ๋ณํ๋์ผ๋ก ๋๋ ๊ฐ์ผ๋ก ์ ์๋ฉ๋๋ค.
-
์ ๋
-
์ด ์์์ ํตํด ๊ฐ์ค์น ์ ๋ฐ์ดํธ์ ํ์์ฑ์ ์ค๋ช ํฉ๋๋ค.
- ๊ฒฝ์ฌ๋ ์์ค ํจ์
-
๊ฐ์ค์น
๊ฐ ์ ๋ฐ์ดํธ: - ํ์ต๋ฅ
๋ฅผ ์ ์ฉํ์ฌ, ๊ฒฝ์ฌ์ ๋ฐ๋ผ ๊ฐ์ค์น๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ณผ์ ์ด ์ค๋ช ๋ฉ๋๋ค. - ์ด๋ ์ฝ๋ ์์์ ํจ๊ป ์ค๋ช
๋๋ฉฐ, PyTorch์์๋
optimizer.step()
์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.
- ํ์ต๋ฅ
-
์ด์ ๋จ๊ณ์์ ๊ณ์ฐ๋ ๊ธฐ์ธ๊ธฐ๋ฅผ ์ด๊ธฐํํ๋ ์ฝ๋ ํํ
- Pytorch์์๋
optimizer.zero_grad()
๋ก ๊ตฌํ๋ฉ๋๋ค. โ ์ด ๋จ๊ณ๋ฅผ ํ์ง ์์ผ๋ฉด ๊ธฐ์ธ๊ธฐ๊ฐ์ด ๋์ ๋์ด ๊ณ์ฐ๋ ๋ฌธ์ ๊ฐ ์๊น
- Pytorch์์๋
-
๊ฒฝ์ฌํ๊ฐ๋ฒ ์๋ ์๋ฆฌ
- ์์์ ๊ฐ์ค์น ๐ค๊ฐ์ ์ ํํ๊ณ
- ์ ํ๋ ๐ค์์ ์ง์ ์ ๊ธฐ์ธ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๋ฏธ๋ถ ๊ฐ
๋ฅผ ๊ตฌํ ํ์ - ๋ฏธ๋ถ ๊ฐ
๊ณผ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ๐ค๋ฅผ ๊ฐ์์์ผ ๋๊ฐ๋ค ๋ณด๋ฉด - ์ต์ข ์ ์ผ๋ก ๊ธฐ์ธ๊ธฐ๊ฐ 0์ด ๋๋ ๊ฒ์ ์ ์ ์์
- ๋ฐ์ด์ด์ค ๐ ๋ํ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ต์ ์ ๋ฐ์ด์ด์ค๋ฅผ ์ฐพ์ ์ ์์ ๋ฐ์ด์ด์ค ๐๋ฅผ ๊ตฌํ๋ ์์ ํํ:
-
๋ฌธ์
- ์ ์ฒด ๋ฐ์ดํฐ ์
์ ์ด์ฉํ์ฌ
์ ๋ฅผ ๊ตฌํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์ ์ด ๋๊ท๋ชจ์ด๋ฉด ๊ณ์ฐ๋น์ฉ์ด ๋งค์ฐ ์ปค์ง๋ค. - ์ ์ญ minima๊ฐ ์๋ local minima์ ๋น ์ง ์ ์๋ค.
- ์ ์ฒด ๋ฐ์ดํฐ ์
์ ์ด์ฉํ์ฌ
1.2 ํ๋ฅ ์ ๊ฒฝ์ฌํ๊ฐ๋ฒ
-
ํ์์ฑ:
-
๊ฒฝ์ฌํ๊ฐ๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ค์น์ ๋ฐ์ด์ด์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ฏ๋ก ๊ณ์ฐ์ด ์ ํํ๊ณ ์์ ์ ์ด์ง๋ง, ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์์๋ ๋นํจ์จ์ ์ ๋๋ค.
-
ํ๋ฅ ์ ๊ฒฝ์ฌํ๊ฐ๋ฒ(Stochastic Gradient Descent, SGD)์ ๊ฐ๊ฐ์ ๋ฐ์ดํฐ ํฌ์ธํธ๋ง๋ค ์ค์ฐจ๋ฅผ ๊ณ์ฐํ์ฌ ๊ฐ์ค์น์ ๋ฐ์ด์ด์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ ๋๋ค.
-
์ด๋ ๊ณ์ฐ ๋น์ฉ์ ์ค์ด๊ณ , ๋ก์ปฌ ๋ฏธ๋๋ง์์ ํ์ถํ์ฌ ๋ ๋์ ๊ธ๋ก๋ฒ ๋ฏธ๋๋ง์ ๋๋ฌํ ์ ์๋๋ก ๋์ต๋๋ค.
-
์์ ํํ
-
-
์ฝ๋ ํํ:
- PyTorch์์ ํ๋ฅ ์ ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ:
import torch.optim as optim optimizer = optim.SGD(model.parameters(), lr=0.01)
1.3 ์ํญ
-
์ํญ์ด๋:
- ์ํญ(Epoch)์ด๋ ๋ชจ๋ธ์ด ์ ์ฒด ๋ฐ์ดํฐ์ ์ ํ ๋ฒ ์์ ํ ํ์ตํ๋ ๊ณผ์ ์ ์๋ฏธํฉ๋๋ค.
- ๋์ผํ ๋ฐ์ดํฐ์ ์ ์ฌ๋ฌ ๋ฒ ํ์ตํจ์ผ๋ก์จ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ง๋ง, ์ํญ ์๊ฐ ๋๋ฌด ๋ง์ผ๋ฉด ๊ณผ์ ํฉ(overfitting)์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
-
์ฝ๋ ํํ:
- ์ํญ ์๋ฅผ ์ค์ ํ๊ณ , ๋ฐ๋ณต์ ์ผ๋ก ํ์ต์ ์ํํ๋ ์ฝ๋:
num_epochs = 1000 for epoch in range(num_epochs): y = model(x_tensor) loss = loss_function(y, t_tensor)
-
์์ค ๊ฐ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
- ์์ค ๊ฐ์ด ํฐ ์ด์ ๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ ์ ์์
- ํ์ต๋ฅ ์ด ๋๋ฌด ํฌ๋ฉด ๋ชจ๋ธ์ด ์ต์ ์ ๊ฐ์ค์น๋ก ์๋ ด์ ๋ชปํจ ยท ํ์ต๋ฅ ์ ๋ฎ์ถ์ด ๋ณด๊ธฐ
- ๋ฐ์ดํฐ์ ๋ ธ์ด์ฆ๊ฐ ๋ง๊ฑฐ๋ ์ด์์น๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ํ์ต์ด ์ด๋ ค์ธ ์ ์์ ยท ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ์ฌ ์ด์์น๋ฅผ ํ์ธํ๊ณ ์ฒ๋ฆฌ
- ์ํญ ์๊ฐ ์ถฉ๋ถํ์ง ์์ผ๋ฉด ๋ชจ๋ธ์ด ์๋ ดํ์ง ์์ ยท ์ํญ ์ ๋๋ ค๋ณด๊ธฐ
- ์์ค ๊ฐ์ด ํฐ ์ด์ ๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ ์ ์์
1.4 ๋ฐ์ดํฐ ํ์คํ
-
๋ฐ์ดํฐ ํ์คํ์ ํ์์ฑ:
- ์์ค๊ฐ์ด ํฐ ์ด์ ๋ ํ์ต๋ฅ , ๋ฐ์ดํฐ ๋ ธ์ด์ฆ, ์ํญ ์ ๋ฑ์ด ์์ธ์ผ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฅผ ๊ฐ์ ํด๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ผ๋ฉด, ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋จ๊ณ์์ ํ์คํ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
- ํ์คํ๋ ํน์ง ๋ณ์์ ๋ชฉํ ๋ณ์์ ํ๊ท ์ 0, ๋ถ์ฐ์ 1๋ก ๋ง์ถ์ด ํ์ต์ ์์ ํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ๋ฐ์ดํฐ ์ฐํฌ๋๋ ๊ฐ์ง๋ง ๋ณ์์ ๊ฐ์ด ๋ณํ๊ฒ ๋ฉ๋๋ค.
-
์ฝ๋ ํํ:
- ๋ฐ์ดํฐ๋ฅผ ํ์คํํ๋ ๋ฐฉ๋ฒ:
from sklearn.preprocessing import StandardScaler scaler_x = StandardScaler() x_scaled = scaler_x.fit_transform(x.reshape(-1, 1))
1.5 ํ์ต ์ ๋ฆฌ
- ๊ฒฝ์ฌํ๊ฐ๋ฒ:
- ๋จธ์ ๋ฌ๋์ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๋ก, ์ฃผ์ด์ง ์์ค ํจ์์์ ๋ชจ๋ธ์ ๊ฐ์ค์น์ ๋ฐ์ด์ด์ค์ ์ต์ ์ ๊ฐ์ ์ฐพ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- ํ๋ฅ ์ ๊ฒฝ์ฌํ๊ฐ๋ฒ:
- ๊ฐ๊ฐ์ ๋ฐ์ดํฐ ํฌ์ธํธ๋ง๋ค ์ค์ฐจ๋ฅผ ๊ณ์ฐํ์ฌ ๊ฐ์ค์น์ ๋ฐ์ด์ด์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
- ์ํญ:
- ๋ชจ๋ธ์ด ์ ์ฒด ๋ฐ์ดํฐ์ ์ ํ ๋ฒ ์์ ํ ํ์ตํ๋ ๊ณผ์ ์ ์๋ฏธํ๋ฉฐ, ๊ณผ๋ํ ์ํญ ์๋ ๊ณผ์ ํฉ์ ์ด๋ํ ์ ์์ต๋๋ค.
- ํ์คํ:
- ํน์ง ๋ณ์์ ๋ชฉํ ๋ณ์์ ์ฐจ์ด๊ฐ ํด ๋, ๋ ๋ณ์์ ํ๊ท ์ 0, ๋ถ์ฐ์ 1๋ก ๋ง์ถ์ด ํ์ต์ ์์ ํํ๋ ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋๋ค.
Day 5
1. ์ ํ ํ๊ท ๋ชจ๋ธ์ ํ ์คํธ
1.1 ํ ์คํธ
-
ํ ์คํธ ๋ฐ์ดํฐ: ์ ํ ํ๊ท ๋ชจ๋ธ์ ์ฃผ์ด์ง ํธ๋ ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ง ๋ณ์์ ๋ชฉํ ๋ณ์ ์ฌ์ด์ ์ ํ ๊ด๊ณ๋ฅผ ํ์ตํฉ๋๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก ํ ์คํธ ๋ฐ์ดํฐ์ ๋ํด ์์ธก์ ์ํํ์ฌ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํ๊ฐํฉ๋๋ค.
-
ํ ์คํธ ๋ฐ์ดํฐ์ ๋์ํ: ํ ์คํธ ๋ฐ์ดํฐ๋ ํธ๋ ์ด๋ ๋ฐ์ดํฐ์ ํฌํจ๋์ง ์์ YearsExperience ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
-
์ฝ๋ ์์:
python์ฝ๋ ๋ณต์ฌ def predict_test_data(test_data): test_scaled = scaler_x.transform(test_data.reshape(-1, 1)) test_tensor = torch.tensor(test_scaled, dtype=torch.float32).view(-1, 1).to(device) model.eval() with torch.no_grad(): # ๊ธฐ์ธ๊ธฐ ๊ณ์ฐ์ ์ค์งํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๊ณ ์์ธก ์๋๋ฅผ ๋ํ predictions_scaled = model(test_tensor) predictions = scaler_t.inverse_transform(predictions_scaled.cpu().numpy()) return predictions
1.2 ํ์ต ์ ๋ฆฌ
- ์ ๋ฆฌ: ํ ์คํธ๋ ํธ๋ ์ด๋ ๋ฐ์ดํฐ์ ํฌํจ๋์ง ์์ ์๋ก์ด ๋ฐ์ดํฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์์ ์ธ ์ซ์ ๊ฐ์ผ๋ก ์์ธกํ๋ ๊ณผ์ ์ ๋๋ค.
2. ์ด์ง ๋ถ๋ฅ ๋ชจ๋ธ
2.1 ์ด์ง ๋ถ๋ฅ์ ์๋ฏธ
-
์ ์: ์ด์ง ๋ถ๋ฅ๋ ์ฃผ์ด์ง ํธ๋ ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ง ๋ณ์์ ๋ชฉํ ๋ณ์(๋ ๊ฐ์ง ๋ฒ์ฃผ) ์ฌ์ด์ ๊ด๊ณ๋ฅผ ํ์ตํ๊ณ , ์ด๋ฅผ ๋ฐํ์ผ๋ก ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ ๊ฐ์ง ๋ฒ์ฃผ ์ค ํ๋๋ก ๋ถ๋ฅํ๋ ๋ชจ๋ธ์ ๊ตฌ์ถํ๋ ๊ณผ์ ์ ๋๋ค.
2.2 ํธ๋ ์ด๋ ๋ฐ์ดํฐ
-
ํธ๋ ์ด๋ ๋ฐ์ดํฐ ๊ตฌ์ฑ: ์ด์ง ๋ถ๋ฅ ๋ชจ๋ธ ํ์ต์ ์ํ ๋ฐ์ดํฐ๋ ํน์ง ๋ณ์์ ์ด์ง ๋ชฉํ ๋ณ์(0 ๋๋ 1)๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
-
์ฝ๋ ์์:
# ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ df = pd.read_csv("Iris.csv", sep=",", header=0)[["PetalLengthCm", "Species"]] # ๋ชฉํ๋ณ์๊ฐ 2๊ฐ์ง๋ง ๊ฐ์ง๋๋ก ์ค์ filtered_data = df[df['Species'].isin(['Iris_setosa', 'Iris-versicolor'])] # ๋ชฉํ๋ณ์๋ฅผ ์ด์ฐํ ๋ ์ด๋ธ๋ก ๋ณํ filtered_data['Species'] = filtered_data['Species'].map({'Iris-setosa': 0, 'Iris-versicolor': 1}) # ๋ฐ์ดํฐ ํ์คํ๋ฅผ ์งํํ ๋ 2์ฐจ์์ ์๊ตฌํด 2์ฐจ์์ผ๋ก ์ค์ x = filtered_data[['PetalLengthCm']].values # ๋ฐ์ดํฐ๋ฅผ 1์ฐจ์ ๋ฐฐ์ด๋ก ๋ณํ t = filtered_data['Species'].values.astype(int)
-
๋ฐ์ดํฐ ๋ถํ : ๋ฐ์ดํฐ์ ์ ํธ๋ ์ด๋ ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋๋๋๋ค.
-
๋ฐ์ดํฐ ํ์คํ ๋ฐ ๋ณํ:
-
์์ธํ
# ๋ฐ์ดํฐ ํ์คํ scaler = StandardScaler() x_train = scaler.fit_transform(x_train) x_test = scaler.transform(x_test) # Tensor๋ก ๋ณํ x_train = torch.tensor(x_train, dtype=torch.float32) # unsqueeze๋ฅผ ํตํด 2์ฐจ์์ผ๋ก ๋ณํ << ๋ฐฐ์น์ฒ๋ฆฌ๋ฅผ ์ํด์๋ [N, 1]์ด์ด์ผํจ t_train = torch.tensor(t_train, dtype=torch.float32).unsqueeze(1)
-
2.3 Dataset & DataLoader ํด๋์ค
-
Dataset & DataLoader ํด๋์ค: PyTorch์์ Dataset๊ณผ DataLoader ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ์ ์ฒ๋ฆฌ์ ๋ฐฐ์น(๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฌถ์ ๋จ์) ์ฒ๋ฆฌ๋ฅผ ์ฉ์ดํ๊ฒ ํ ์ ์์ต๋๋ค.
-
๋ฏธ๋ ๋ฐฐ์น ๊ฒฝ์ฌํ๊ฐ๋ฒ ๊ฒฝ์ฌํ๊ฐ๋ฒ๊ณผ ํ๋ฅ ์ ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ์ฅ์ ๊ณผ ๋จ์ ์ ๋ณด์ํ ๊ธฐ๋ฒ, ์์ ๋ฐฐ์น ๋จ์๋ก ๊ฐ์ค์น๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
-
์ฝ๋ ์์:
python์ฝ๋ ๋ณต์ฌ from torch.utils.data import DataLoader, TensorDataset class IrisDataset(Dataset): def __init__(self, features, labels): self.features = features self.labels = labels def __len__(self): return len(self.features) def __getitem__(self, idx): return self.features[idx], self.labels[idx] train_dataset = IrisDataset(x_train, t_train) test_dataset = IrisDataset(x_test, t_test) train_loader = DataLoader(train_dataset, batch_size=4, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=4, shuffle=False)
2.4 ์ด์ง ๋ถ๋ฅ ๋ชจ๋ธ
-
๋ก์ง์คํฑ ํ๊ท ์๊ณ ๋ฆฌ์ฆ: ๋ก์ง์คํฑ ํ๊ท๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ตฌ๋ถํ ์ ์๋ ์ต์ ์ ๊ฒฐ์ ๊ฒฝ๊ณ๋ฅผ ์ฐพ๊ณ **(1), ์๊ทธ๋ชจ์ด๋ ํจ์๋ฅผ ํตํด ์ด ๊ฒฝ๊ณ๋ฅผ ๊ธฐ์ค(2)์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ด์ง ๋ถ๋ฅํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.(3)**
-
์ฝ๋ ์์:
class BinaryClassificationModel(nn.Module): def __init__(self): super(BinaryClassificationModel, self).__init__() self.linear = nn.Linear(1, 1) self.sigmoid = nn.Sigmoid() def forward(self, x): z = self.linear(x) y = self.sigmoid(z) return y
2.5 ํ์ต ์ ๋ฆฌ
- ์ ๋ฆฌ: ์ด์ง ๋ถ๋ฅ๋ ํธ๋ ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ง ๋ฒ์ฃผ ์ค ํ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ๋ ๋ชจ๋ธ์ ๊ตฌ์ถํ๋ ๊ณผ์ ์ ๋๋ค. PyTorch์์๋ ๋ฐ์ดํฐ์ ์ ์ฒ๋ฆฌ์ ๋ฐฐ์น ์ฒ๋ฆฌ๋ฅผ ์ฉ์ดํ๊ฒ ํ ์ ์๋๋ก Dataset๊ณผ DataLoader ํด๋์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ก์ง์คํฑ ํ๊ท๋ ์ด์ง ๋ถ๋ฅ ๋ชจ๋ธ์ ์ค์ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
1. ์ด์ง ๊ต์ฐจ ์ํธ๋กํผ
1.1 ์ด์ง ๊ต์ฐจ ์ํธ๋กํผ
-
์ด์ง ๋ถ๋ฅ์ ์๋ฏธ (Review):
- ์ด์ง ๋ถ๋ฅ๋ ์ฃผ์ด์ง ํธ๋ ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ง ๋ณ์์ ๋ชฉํ ๋ณ์(๋ ๊ฐ์ง ๋ฒ์ฃผ) ์ฌ์ด์ ๊ด๊ณ๋ฅผ ํ์ตํ๊ณ , ์ด๋ฅผ ๋ฐํ์ผ๋ก ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ ๊ฐ์ง ๋ฒ์ฃผ ์ค ํ๋๋ก ๋ถ๋ฅํ๋ ๋ชจ๋ธ์ ๊ตฌ์ถํ๋ ๊ณผ์ ์ ๋๋ค.
-
์ด์ง ๊ต์ฐจ ์ํธ๋กํผ:
- ์ด์ง ๋ถ๋ฅ ๋ชจ๋ธ์์ ์ต์ข
์ถ๋ ฅ ๊ฐ์ธ
๋ ์๊ทธ๋ชจ์ด๋ ํจ์์ ์ํด 0๊ณผ 1 ์ฌ์ด์ ์ฐ์์ ์ธ ๊ฐ์ ๊ฐ์ง๋ฏ๋ก, ์ด ๊ฐ์ 0 ๋๋ 1๋ก ๋ถ๋ฅํ๊ธฐ ์ํด ์ด์ง ๊ต์ฐจ ์ํธ๋กํผ(Binary Cross Entropy, BCE)๋ผ๋ ์์ค ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. - ์ด์ง ๊ต์ฐจ ์ํธ๋กํผ๋ ์ด์ง ๋ถ๋ฅ ๋ฌธ์ ์์ ๋ชจ๋ธ์ ์์ธก ๋ณ์์ ๋ชฉํ ๋ณ์ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ธก์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์์ค ํจ์์ ๋๋ค.
- ์ด์ง ๋ถ๋ฅ ๋ชจ๋ธ์์ ์ต์ข
์ถ๋ ฅ ๊ฐ์ธ
-
์ด์ง ๊ต์ฐจ ์ํธ๋กํผ์ ์์ ํํ:
= 0 or 1์ ๊ฐ์ง๋ label์ด๋ค. - ์ด์ง ๊ต์ฐจ ์ํธ๋กํผ๋ ๋ค์๊ณผ ๊ฐ์ ์์์ผ๋ก ํํ๋ฉ๋๋ค:
1.2 ์ด์ง ๊ต์ฐจ ์ํธ๋กํผ ์ ๋๋ฅผ ์ํ ์ฌ์ ๊ฐ๋
-
์กฐ๊ฑด๋ถ ํ๋ฅ :
- ์กฐ๊ฑด๋ถ ํ๋ฅ ์ ์ฌ๊ฑด A๊ฐ ๋ฐ์ํ ์ํฉ์์ ๋ค๋ฅธ ์ฌ๊ฑด B๊ฐ ๋ฐ์ํ ํ๋ฅ ์ ์๋ฏธํฉ๋๋ค.
- ์์์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ด ํํ๋ฉ๋๋ค:
-
๊ฐ๋ฅ๋ ํจ์:
- ๊ฐ๋ฅ๋๋ ์ฃผ์ด์ง ๋ฐ์ดํฐ๊ฐ ํน์ ๋ชจ์ ๊ฐ ํ์์ ๊ด์ฐฐ๋ ํ๋ฅ ์ ์๋ฏธํฉ๋๋ค.
- ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์์ ๋ ๊ฐ๋ฅ๋ ํจ์๋ ๊ฐ ๋ฐ์ดํฐ์ ๊ฐ๋ฅ๋๋ฅผ ๊ณฑํ์ฌ ๊ณ์ฐํ๋ฉฐ, ์ด๋ฅผ ์์์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
์ต๋ ๊ฐ๋ฅ๋ ์ถ์ (MLE):
- ์ต๋ ๊ฐ๋ฅ๋ ์ถ์ ์ ์ฃผ์ด์ง ๋ฐ์ดํฐ์ ์ ๋ํด ๋ชจ์๋ฅผ ์ถ์ ํ๋ ๋ฐฉ๋ฒ๋ก ์ผ๋ก, ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฅ ์ ์ค๋ช ํ๋ ๋ชจ์๋ฅผ ์ฐพ๊ธฐ ์ํด ๊ฐ๋ฅ๋(likelihood) ํจ์๋ฅผ ์ต๋ํํ๋ ๊ณผ์ ์ ๋๋ค.
- ๊ฐ๋ฅ๋ ํจ์์ ์ต๋๊ฐ์ ์ฐพ์์ผํ๋๋ฐ ์ด๋ ํจ์์ ๋ฏธ๋ถ๊ณ์๊ฐ 0์ด ๋๋ ์ง์ ์ ์ฐพ์ผ๋ฉด ๋๋ค. ์ด๋ ๊ฐ๋ฅ๋ํจ์๋ฅผ ๋ก๊ทธ ๊ฐ๋ฅ๋ ํจ์๋ก ๋ฐ๊พธ์ด ํธ๋ฏธ๋ถ์ ๊ณ์ฐํ๋ค.
- MLE๋ฅผ ํตํด ์ค์ ๋ก ๊ณ์ฐ๋ ๊ตฌ์ฒด์ ์ธ ๋ชจ์ ๊ฐ์ ์ต๋ ๊ฐ๋ฅ๋ ์ถ์ ์น๋ผ๊ณ ํฉ๋๋ค.
-
๋ก๊ทธ ๊ฐ๋ฅ๋ ํจ์:
-
ํ๋ฅ ๊ฐ์ ๋ฒ์๋ฅผ ํ์ฅํด ๋ฐ์ดํฐ ๋น๊ต๊ฐ ์ฉ์ดํด์ง๋๋ค. ex) [0,1] โ (-โ, 0]
-
๊ทธ๋ํ
-
-
๋ก๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฅ๋ ํจ์๋ฅผ ๋ณํํ๋ฉด ๊ณฑ์ ์ ๋ง์ ์ผ๋ก ๋ณํํ ์ ์๊ณ , ์ฐ์ฐ์ ๋ณต์ก์ฑ์ ์ค์ผ ์ ์์ต๋๋ค.
-
๋ฐ์ดํฐ ์ซ์ ๋จ์๋ฅผ ์ค์ผ ์ ์๋ค.
-
1.3 ์ด์ง ๊ต์ฐจ ์ํธ๋กํผ ์ ๋
-
์ ๋ ๊ณผ์ : ์ด์ง ๋ถ๋ฅ ๋ชจ๋ธ์ ์ถ๋ ฅ ๊ฐ
๋ ์๊ทธ๋ชจ์ด๋ ํจ์๋ฅผ ํตํด 0๊ณผ 1 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง๋ฉฐ, ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฅ ๋ณ์ ๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ ๊ฐ์ ํํํ ์ ์์ต๋๋ค. -
์์์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
= 0 or 1 -
์ด ์์์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ์ ๋ํ ๋ก๊ทธ ๊ฐ๋ฅ๋ ํจ์๋ฅผ ๊ณ์ฐํ๊ณ , ์ด๋ฅผ ์ต์ํํ๋ฉด ์ด์ง ๊ต์ฐจ ์ํธ๋กํผ ์์ค ํจ์๋ฅผ ๋์ถํ ์ ์์ต๋๋ค:
-
์ฝ๋ ์์:
loss_function = nn.BCELoss()
1.4 ํ์ต ์ ๋ฆฌ
- ์์ฝ:
- ์ด์ง ๊ต์ฐจ ์ํธ๋กํผ๋ ์ด์ง ๋ถ๋ฅ ๋ฌธ์ ์์ ๋ชจ๋ธ์ ์์ธก ๋ณ์์ ๋ชฉํ ๋ณ์ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ธก์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์์ค ํจ์์ ๋๋ค.
- ์กฐ๊ฑด๋ถ ํ๋ฅ ๊ณผ ์ต๋ ๊ฐ๋ฅ๋ ์ถ์ ์ ์ด์ง ๊ต์ฐจ ์ํธ๋กํผ ์์์ ์ดํดํ๋ ๋ฐ ํ์ํ ์ค์ํ ๊ฐ๋ ์ ๋๋ค.
2. ์ด์ง ๋ถ๋ฅ ๋ชจ๋ธ์ ํ ์คํธ
2.1 ํ ์คํธ
-
ํ ์คํธ ๋ฐ์ดํฐ:
- ์ด์ง ๋ถ๋ฅ ๋ชจ๋ธ์ ํธ๋ ์ด๋ ๋ฐ์ดํฐ์ ํฌํจ๋์ง ์์ PetalLengthCm ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํ๊ฐํฉ๋๋ค.
-
์ฝ๋ ์์:
model.eval() with torch.no_grad(): predictions = model(x_test) # ๋ชจ๋ธ์ ์ถ๋ ฅ ๊ฐ์ด 0.5๋์ผ๋ฉด 1, ์๋๋ฉด 0 predicted_labels = (predictions > 0.5).float() actual_labels = t_test.numpy() predicted_labels = predicted_labels.numpy()
-
๊ฒฐ๊ณผ ์๊ฐํ:
- ์์ธก ๊ฒฐ๊ณผ์ ์ค์ ๋ผ๋ฒจ์ ์๊ฐํํ์ฌ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์๊ฐ์ ์ผ๋ก ํ๊ฐํ ์ ์์ต๋๋ค.
plt.scatter(range(len(actual_labels)), actual_labels, color='blue', label='Actual Labels') plt.scatter(range(len(predicted_labels)), predicted_labels, color='red', marker='x', label='Predicted Labels') plt.legend() plt.show()
2.2 ํ์ต ์ ๋ฆฌ
- ์์ฝ:
- ํ ์คํธ๋ ํธ๋ ์ด๋ ๋ฐ์ดํฐ์ ํฌํจ๋์ง ์์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ ์ ์ ์๋ ๋ ๊ฐ์ง ๋ฒ์ฃผ ์ค ํ๋๋ก ๋ถ๋ฅํ๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํ๊ฐํ๋ ๊ณผ์ ์ ๋๋ค.