딥러닝 _ Pytorch로 경사하강법을 구현해보자

1. 데이터 정의_ 공부한 시간에 따른 결과 점수 예측

시간(x) 포인트(y)
1 2
2 4
6
4 ?
  • x_train = torch.FloatTensor(((1),(2),(3)))
  • y_train = torch.FloatTensor(((2),(4),(6)))

2. 가설

y = Wx + b

가중치와 편향을 0으로 초기화합니다.

require_grad=True : 학습할 것임을 지정

  • W = torch.zeros(1, requires_grad=True)
  • b = torch.zeros(1, requires_grad=True)
  • 가설 = x_train * W + b

3. 손실 계산


평균(torch.mean 포함)

  • 비용 = torch.mean((가설 – y_train) ** 2)

모두를 위한 딥러닝 시즌 2_PyTorch

4.경사 하강법

torch.optim 라이브러리를 사용하십시오.

(W,b)는 학습할 텐서입니다.

lr = 0.01 은 학습률

  • 옵티마이저 = optim.SGD((W, b), lr=0.01)
  • 옵티마이저.zero_grad()
    비용.역방향()
    옵티마이저.스텝()

1. zero_grad()로 그래디언트 초기화

2. backward()로 기울기를 계산합니다.

3. step() 개선

# 데이터
x_train = torch.FloatTensor(((1), (2), (3)))
y_train = torch.FloatTensor(((1), (2), (3)))
# 모델 초기화
W = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# optimizer 설정, 학습준비
optimizer = optim.SGD((W, b), lr=0.01)

nb_epochs = 1000
for epoch in range(nb_epochs + 1):
    
    # H(x) 계산
    hypothesis = x_train * W + b
    
    # cost 계산
    cost = torch.mean((hypothesis - y_train) ** 2)

    # cost로 H(x) 개선
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()


다변수 선형 회귀

1.데이터

퀴즈1(x1) 퀴즈2(x2) 퀴즈3(x3) 끝(y)
73 80 75 152
93 88 93 185
89 91 80 180
96 98 100 196
73 66 70 142
  • x1_train = torch.FloatTensor(((73), (93), (89), (96), (73)))
  • x2_train = torch.FloatTensor(((80), (88), (91), (98), (66)))
  • x3_train = torch.FloatTensor(((75), (93), (90), (100), (70)))
  • y_train = torch.FloatTensor(((152), (185), (180), (196), (142)))

2. 가설 기능


  • 가설 = x_train.matmul(W) + b

계산은 matmul로 한 번에 할 수 있습니다.

3. 비용

비용 = torch.mean((가설 – y_train) ** 2)

4. torch.optim을 사용한 경사하강법


  • 옵티마이저 = optim.SGD((W, b), lr=1e-5)
  • 옵티마이저.zero_grad()
    비용.역방향()
    옵티마이저.스텝()

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)))

# 모델 초기화
W = torch.zeros((3, 1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# optimizer 설정
optimizer = optim.SGD((W, b), lr=1e-5)

nb_epochs = 20
for epoch in range(nb_epochs + 1):
    
    # H(x) 계산
    hypothesis = x_train.matmul(W) + b # or .mm or @

    # cost 계산
    cost = torch.mean((hypothesis - y_train) ** 2)

    # cost로 H(x) 개선
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()

    # 100번마다 로그 출력
    print('Epoch {:4d}/{} hypothesis: {} Cost: {:.6f}'.format(
        epoch, nb_epochs, hypothesis.squeeze().detach(), cost.item()
    ))

Pytorch 클래스를 사용한 경사 하강법

nn.모듈

class MultivariateLinearRegressionModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(3, 1)

    def forward(self, x):
        return self.linear(x)
  • nn.module을 상속하여 모델을 생성합니다.

  • nn.module(3,1) : 입력 차원 = 3, 출력 차원 = 1
  • 가설 계산은 forward()에서 수행됩니다.

  • 기울기 계산은 Pytorch에 의해 수행됩니다.

    뒤로()

F.mse_loss

import torch.nn.functional as F

cost = F.mse_loss(prediction, y_train)

손쉬운 손실 변경

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 = MultivariateLinearRegressionModel()
# optimizer 설정
optimizer = optim.SGD(model.parameters(), lr=1e-5)

nb_epochs = 20
for epoch in range(nb_epochs+1):
    
    # H(x) 계산
    hypothesis = model(x_train)
    
    # cost 계산
    cost = F.mse_loss(hypothesis, y_train)
    
    # cost로 H(x) 개선
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()
    
    # 20번마다 로그 출력
    print('Epoch {:4d}/{} Cost: {:.6f}'.format(
        epoch, nb_epochs, cost.item()
    ))