nn.Linear()
nn.functional.mse_loss()
import torch
import torch.nn as nn
import torch.nn.functional as F
torch.manual_seed(1)
torch.manual_seed(1)
Sets the seed for generating random numbers. Returns a torch.Generator object.
난수를 생성할때, 고정된 값을 얻을 수 있도록 seed를 고정시키는 함수
주로 초기화 작업에서 사용됨.
#w=2, b=0인 모델
x_train=torch.FloatTensor([[1],[2],[3]])
y_train=torch.FloatTensor([[2],[4],[6]])
# 모델을 선언 및 초기화
model=nn.Linear(1,1)
print(list(model.parameters())) #랜덤 초기화 됨
model.parameters
함수로 모델의 가중치(w
)와 편향(b
)을 확인할 수 있음. nb_epochs=2000
for epoch in range(nb_epochs+1):
# H(x)
prediction=model(x_train)
#cost
cost=F.mse_loss(prediction,y_train) # 파이토치에서 제공하는 평균 제곱 오차 함수
# cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch % 100==0:
print('Epoch {:4d}/{} Cost: {:.6f}'.format(epoch,nb_epochs,cost.item()))
H(x)
model
에 x_train
데이터를 넣어서 가설 함수 생성cost
prediction
(예측값)과 y_train
(실제값)의 평균제곱오차를 구함. F.mse_losss()
W
와 b
를 갱신시키는가? optimizer.zero_grad()
cost.backward()
x.grad+=\frac{d(cost)}{d(x)}
optimizer.step()
lr(learning rate)
를 곱하여 빼주면서 업데이트x-= lr * x.grad
#임의의 입력 4를 선언
new_var=torch.FloatTensor([[4.0]])
# 입력한 값 4에 대해서 예측값 y를 리턴, pred_y에 저장
pred_y=model(new_var)
print('훈련 후 입력이 4일때의 예측값: ', pred_y)
훈련 후 입력이 4일때의 예측값: tensor([[7.9989]], grad_fn=<AddmmBackward0>)
model
에 input으로 넣었음. print(list(model.parameters()))
[Parameter containing:
tensor([[1.9994]], requires_grad=True), Parameter containing:
tensor([0.0014], requires_grad=True)]
w
는 1.9994, b
는 0.0014의 값을 가짐.H(x)
식에 입력 x
로부터 예측된 y
를 얻는 것을 forward 연산이라고 함. prediction=model(x_train)
은 x_train
으로부터 예측값을 리턴하므로 forward 연산이라고 함. pred_y=model(new_var)
은 임의의 값 new_var
로부터 예측값을 리턴하므로 forward 연산이라고 함. cost.backward()
는 비용함수로부터 기울기를 구하라는 의미이며, backward 연산임. x
로부터 1개의 y
를 예측하는 문제import torch
import torch.nn as nn
import torch.nn.functional as F
torch.manual_seed(1)
#데이터
x_train=torch.FloatTensor([[73,80,75],
[93,88,93],
[89,91,90],
[96,98,100],
[73,66,70]])
y_train=torch.FloatTensor([[152],[185],[180],[196],[142]])
model=nn.Linear(3,1)
print(list(model.parameters()))
[Parameter containing:
tensor([[ 0.2975, -0.2548, -0.1119]], requires_grad=True), Parameter containing:
tensor([0.2710], requires_grad=True)]
optimizer=torch.optim.SGD(model.parameters(),lr=1e-5)
nb_epochs=2000
for epoch in range(nb_epochs+1):
#H(x)
prediction=model(x_train)
# (동일) prediction=model.forward(x_train)
#cost
cost=F.mse_loss(prediction,y_train) # 파이토치에서 제공하는 평균 제곱 오차 함수
#cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch % 100==0:
print('Epoch {:4d}/{} Cost: {:.6f}'.format(epoch,nb_epochs,cost.item()))
# 임의의 입력 [73,80,75] 선언
new_var=torch.FloatTensor([[73,80,75]])
# 입력한 값에 대한 예측값을 pred_y에 저장
pred_y=model(new_var)
print('훈련 후 입력이 [73,80,75]일때의 예측값:',pred_y)
훈련 후 입력이 [73,80,75]일때의 예측값: tensor([[151.2306]], grad_fn=<AddmmBackward0>)
pred_y
값 확인print(list(model.parameters()))
[Parameter containing:
tensor([[0.9778, 0.4539, 0.5768]], requires_grad=True), Parameter containing:
tensor([0.2802], requires_grad=True)]