선형회귀는 입력 변수와 출력 변수 사이의 관계를 설명하는 직선을 찾는 기법
W(weight) - 가중치
b(Bias) - 편향
입력 값 x가 들어왔을 때 W와 b를 조정하며 정확한 y를 예측하는 것.!
x(입력 값) [[1], [2], [3]] 이 y(출력 값) [[10.0], [20.0], [30.0]] 으로 되게 W와 b를 찾는 것이다.
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[10.0], [20.0], [30.0]])
import torch
import torch.optim as optim
torch.optim패키지는 가중치 업데이트를 편리하도록 알고리즘을 모아둔 패키지이다.
#weight
W = torch.zeros(1,requires_grad=True)
#bias
b = torch.zeros(1,requires_grad=True)
requires_grad=True은 텐서의 모든 연산을 기록하기 위해 사용한다. True로 설정을 해두면 torch가 모든 연산을 기록한다.
#Optimizer 설정
optimizer = optim.SGD([W,b],lr=0.01)
optim.SGD는 W,b를 0.01의 학습률을 이용해 값을 조정한다.
역전파로 계산된 기울기 값을 W = W - (lr - gradient) 을 이용해 조정한다.
optimizer.zero_grad()
cost.backward()
optimizer.step()
optimizer.zero_grad()모델의 가중치 (W,b)에 저장되어있는 기울기를 0으로 초기화 한다. Pytorch는 역전파를 할때마다 기존값에 더해버리는 정실이 있기 때문에 원하는 학습결과를 위해 초기화해야한다.
cost.backward()오차를 기준으로 미분을 수행하여 기울기 값이 채워짐
optimizer.step()학습률을 곱해서 실제 가중치를 업데이트 한다.
import torch
import torch.optim as optim
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[10.0], [20.0], [30.0]])
#weight
W = torch.zeros(1,requires_grad=True)
#bias
b = torch.zeros(1,requires_grad=True)
#Optimizer 설정
optimizer = optim.SGD([W,b],lr=0.01)
nb_epochs = 10000
for epoch in range(1,nb_epochs+1):
hypothesis = x_train * W + b
cost = torch.mean((hypothesis - y_train)**2)
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch % 1000 == 0:
print(f'Epoch {epoch:4d}/{nb_epochs} W: {W.item():.3f}, b: {b.item():.3f} Cost: {cost.item():.6f}')