
- ๋ถ๋ฅ๋ฅผ ํ ๋ ์ฌ์ฉํ๋ฉฐ, ์ ํ ํ๊ท ๊ณต์์ผ๋ก๋ถํฐ ๋์๊ธฐ ๋๋ฌธ์ ๋ ผ๋ฆฌํ๊ท๋ผ๋ ์ด๋ฆ์ด ๋ถ์ฌ์ง
- ํ๊ท ๋ถ์์ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง ๋ถ๋ฅ ๋ฌธ์ ์ ์ฌ์ฉ
- ์ฃผ๋ก ์๊ทธ๋ชจ์ด๋ ํจ์๋ฅผ ์ฌ์ฉ
x = torch.tensor([1.0, 2.0, 3.0]) w = torch.tensor([0.1, 0.2, 0.3]) b = torch.tensor(0.5)
z = torch.dot(w, x) + b # dot: ๋ด์
z
tensor(1.9000)
sigmoid = nn.Sigmoid()
output = sigmoid(z)
outputtensor(0.8699)

import torch
import torch.nn as nn
x = torch.tensor([1.0, 2.0, 3.0])
w = torch.tensor([0.1, 0.2, 0.3])
b = torch.tensor(0.5)
z = torch.dot(w, x) + b # dot: ๋ด์
z
> tensor(1.9000)
sigmoid = nn.Sigmoid()
output = sigmoid(z)
output
> tensor(0.8699)
import torch.optim as optim
import matplotlib.pyplot as plt
torch.manual_seed(2024)
x_train = torch.FloatTensor([[0], [1], [3], [5], [8], [11], [15], [20]])
y_train = torch.FloatTensor([[0], [0], [0], [0], [1], [1], [1], [1]])
print(x_train.shape)
print(y_train.shape)
> torch.Size([8, 1])
> torch.Size([8, 1])
plt.figure(figsize=(8,5))
plt.scatter(x_train, y_train)

model = nn.Sequential(
nn.Linear(1, 1),
nn.Sigmoid()
)
model
> Sequential(
(0): Linear(in_features=1, out_features=1, bias=True)
(1): Sigmoid()
)
list(model.parameters()) # W: 0.0634 b: 0.6625
> [Parameter containing:
tensor([[0.0634]], requires_grad=True),
Parameter containing:
tensor([0.6625], requires_grad=True)]

- ๋ ผ๋ฆฌํ๊ท์์๋ nn.BCELoss() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ Loss ๊ณ์ฐ
- 1๋ฒ ์๊ทธ๋ง, 2๋ฒ ์๊ทธ๋ง ์ค์์ 1๋ฒ ์๊ทธ๋ง๋ ์ ๋ต์ด ์ฐธ์ด์์ ๋ ๋ถ๋ถ, 2๋ฒ ์๊ทธ๋ง๋ ์ ๋ต์ด ๊ฑฐ์ง์ด์์ ๋ ๋ถ๋ถ
y_pred = model(x_train)
loss = nn.BCELoss()(y_pred, y_train)
loss
> tensor(0.6901, grad_fn=<BinaryCrossEntropyBackward0>)
optimizer = optim.SGD(model.parameters(), lr=0.01)
epochs = 1000
for epoch in range(epochs + 1):
y_pred = model(x_train)
loss = nn.BCELoss()(y_pred, y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 100 == 0:
print(f'Epoch: {epoch}/{epochs} Loss: {loss:.6f}')
> Epoch: 0/1000 Loss: 0.690111
> Epoch: 100/1000 Loss: 0.612832
> Epoch: 200/1000 Loss: 0.550762
> Epoch: 300/1000 Loss: 0.498473
> Epoch: 400/1000 Loss: 0.454446
> Epoch: 500/1000 Loss: 0.417278
> Epoch: 600/1000 Loss: 0.385753
> Epoch: 700/1000 Loss: 0.358851
> Epoch: 800/1000 Loss: 0.335734
> Epoch: 900/1000 Loss: 0.315727
> Epoch: 1000/1000 Loss: 0.298285
list(model.parameters())
> [Parameter containing:
tensor([[0.2875]], requires_grad=True),
Parameter containing:
tensor([-1.2444], requires_grad=True)]
x_test = torch.FloatTensor([[10]])
y_pred = model(x_test)
y_pred
> tensor([[0.8363]], grad_fn=<SigmoidBackward0>)
# ์๊ณ์น ์ค์ ํ๊ธฐ
# 0.5๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด 1
# 0.5๋ณด๋ค ์์ผ๋ฉด 0
y_bool = (y_pred >= 0.5).float()
y_bool
> tensor([[1.]])
x_train = [[1, 2, 1, 1],
[2, 1, 3, 2],
[3, 1, 3, 4],
[4, 1, 5, 5],
[1, 7, 5, 5],
[1, 4, 5, 9],
[1, 7, 7, 7],
[2, 8, 7, 8]]
# ๋ณ์ 4๊ฐ
y_train = [0, 0, 0, 1, 1, 1, 2, 2]
# ํด๋์ค 3
x_train = torch.FloatTensor(x_train)
y_train = torch.LongTensor(y_train)
print(x_train.shape)
print(y_train.shape)
> torch.Size([8, 4])
> torch.Size([8])
model = nn.Sequential(
nn.Linear(4, 3) # ์
๋ ฅ 4๊ฐ ์ถ๋ ฅ 3๊ฐ
# ์์ ๋จํญ์์ ์ถ๋ ฅ์ด 1์ธ ์ด์ ๋ Sigmoid๋ก 0๋๋ 1์ด ๋ ํ๋ฅ ์ ๋ฐํํ๊ธฐ ๋๋ฌธ์
# ์ด๋ฒ์๋ ๊ฐ๊ฐ์ ์ถ๋ ฅ์ ๋ํ ํ๋ฅ ์ ๋ฐํ(ํ๋ฅ ์ด ํฉ์ 1)
)
model
> Sequential(
(0): Linear(in_features=4, out_features=3, bias=True)
)
y_pred = model(x_train)
y_pred
> tensor([[-0.3467, 0.0954, -0.5403],
[-0.3109, -0.0908, -1.3992],
[-0.1401, 0.1226, -1.3379],
[-0.4850, 0.0565, -2.1343],
[-4.1847, 1.6323, -0.7154],
[-3.6448, 2.2688, -0.0846],
[-5.1520, 2.1004, -0.9593],
[-5.2114, 2.1848, -1.0401]], grad_fn=<AddmmBackward0>)

- ๊ต์ฐจ ์ํธ๋กํผ ์์ค ํจ์๋ Pytorch์์ ์ ๊ณตํ๋ ์์ค ํจ์ ์ค ํ๋๋ก ๋ค์ค ํด๋์ค ๋ถ๋ฅ ๋ฌธ์ ์ ์ฌ์ฉ
- ์ํํธ๋งฅ์ค ํจ์์ ๊ต์ฐจ ์ํธ๋กํผ ์์ค ํจ์๋ฅผ ๊ฒฐํฉํ ํํ
- ์ํํธ๋งฅ์ค ํจ์๋ฅผ ์ ์ฉํ์ฌ ๊ฐ ํด๋์ค์ ๋ํ ํ๋ฅ ๋ถํฌ๋ฅผ ์ป์
- ๊ฐ ํด๋์ค์ ๋ํ ๋ก๊ทธ ํ๋ฅ ์ ๊ณ์ฐ
- ์ค์ ๋ผ๋ฒจ๊ณผ ์์ธก ํ๋ฅ ์ ๋ก๊ทธ๊ฐ ๊ฐ์ ์ฐจ์ด๋ฅผ ๊ณ์ฐ
- ๊ณ์ฐ๋ ์ฐจ์ด์ ํ๊ท ์ ๊ณ์ฐํ์ฌ ์ต์ข ์์ค ๊ฐ์ ์ป์

- ๋ค์ค ํด๋์ค ๋ถ๋ฅ ๋ฌธ์ ์์ ์ฌ์ฉ๋๋ ํจ์๋ก ์ฃผ์ด์ง ์ ๋ ฅ ๋ฒกํฐ์ ๊ฐ์ ํ๋ฅ ๋ถํฌ๋ก ๋ณํ
- ๊ฐ ํด๋์ค์ ์ํ ํ๋ฅ ์ ๊ณ์ฐํ ์ ์์ผ๋ฉฐ, ๊ฐ ์์๋ฅผ 0๊ณผ 1์ฌ์ด์ ๊ฐ์ผ๋ก ๋ณํํ์ฌ ์ด ๊ฐ๋ค์ ํฉ์ ํญ์ 1์ด ๋๋๋ก ํจ
- ๊ฐ ์ ๋ ฅ ๊ฐ์ ๋ํด ์ง์ํจ์๋ฅผ ์ ์ฉ
- ์ง์ ํจ์๋ฅผ ์ ์ฉํ ๋ชจ๋ ๊ฐ์ ํฉ์ ๊ณ์ฐํ ํ, ๊ฐ ์ง์์ ํฉ์ผ๋ก ๋๋์ด ์ ๊ทํ
- ์ ๊ทํ๋ฅผ ํตํด ๊ฐ ๊ฐ์ 0๊ณผ 1์ฌ์ด์ ํ๋ฅ ๊ฐ์ผ๋ก ์ถ๋ ฅ
loss = nn.CrossEntropyLoss()(y_pred, y_train)
loss
> tensor(1.2760, grad_fn=<NllLossBackward0>)
optimizer = optim.SGD(model.parameters(), lr=0.01)
epochs = 10000
for epoch in range(epochs + 1):
y_pred = model(x_train)
loss = nn.CrossEntropyLoss()(y_pred, y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 100 == 0:
print(f'Epoch: {epoch}/{epochs} Loss: {loss: .6f}')
> Epoch: 0/10000 Loss: 1.276001
> Epoch: 100/10000 Loss: 0.701097
> Epoch: 200/10000 Loss: 0.658791
> Epoch: 300/10000 Loss: 0.634072
...
> Epoch: 9700/10000 Loss: 0.285849
> Epoch: 9800/10000 Loss: 0.284502
> Epoch: 9900/10000 Loss: 0.283167
> Epoch: 10000/10000 Loss: 0.281846
x_test = torch.FloatTensor([[1, 7, 8, 7]])
y_pred = model(x_test)
y_pred
> tensor([[-10.6285, 1.0027, 4.9401]], grad_fn=<AddmmBackward0>)
# nn.Softmax(1)
# ์ํํธ๋งฅ์ค ํจ์๋ฅผ ์ ์ฉํ ์ฐจ์์ ์ง์
# dim=0์ผ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ์ฐจ์์ ๋ฐ๋ผ ์ํํธ ๋งฅ์ค๋ฅผ ๊ณ์ฐ (ํ๋ผ๋ฆฌ ๊ณ์ฐ)
# dim=1์ผ ๊ฒฝ์ฐ ๋ ๋ฒ์งธ ์ฐจ์์ ๋ฐ๋ผ ์ํํธ ๋งฅ์ค๋ฅผ ๊ณ์ฐ (์ด๋ผ๋ฆฌ ๊ณ์ฐ)
y_prob = nn.Softmax(1)(y_pred)
y_prob
> tensor([[1.6993e-07, 1.9127e-02, 9.8087e-01]], grad_fn=<SoftmaxBackward0>)
print(f'0์ผ ํ๋ฅ : {y_prob[0][0]:.2f}')
print(f'1์ผ ํ๋ฅ : {y_prob[0][1]:.2f}')
print(f'2์ผ ํ๋ฅ : {y_prob[0][2]:.2f}')
> 0์ผ ํ๋ฅ : 0.00
> 1์ผ ํ๋ฅ : 0.02
> 2์ผ ํ๋ฅ : 0.98
torch.argmax(y_prob, axis=1) # ํ๋ฅ ์ด ๊ฐ์ฅ ๋์ ๊ฐ
> tensor([2])