| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
- 논문리뷰
- pytorch
- panoptic nerf
- ICCV 2021
- 논문
- Python
- Paper
- CVPR
- ICCV
- 경희대
- 리눅스
- panoptic segmentation
- NeRF paper
- Vae
- 2022
- 딥러닝
- 파이토치
- 융합연구
- paper review
- 논문 리뷰
- Deep Learning
- CVPR2023
- docker
- Semantic Segmentation
- NERF
- GAN
- Computer Vision
- IROS
- Neural Radiance Field
- linux
- Today
- Total
윤제로의 제로베이스
03-1 선형회귀(Linear Regression) 본문
https://wikidocs.net/53560
1. 데이터에 대한 이해 (Data Definition)
1) 훈련 데이터셋과 테스트 데이터셋
2. 가설 수립
머신러닝에서의 식을 가설(Hypothesis)라고 한다.
선형 회귀의 가설은 다음고 같다.
y = Wx + b
이 때 x와 곱해지는 W를 가중치(Weight)라고 하며, b를 편향(bias)라고 한다.
3. 비용 함수(Cost function)에 대한 이해
비용 함수(cost function) = 손실 함수(loss function) = 오차 함수(error function) = 목적 함수(objective function)
4. 옵티마이저 - 경사 하강법(Gradient Descent)
비용 함수(cost function)의 값을 최소로 하는 W와 b를 찾기 위해 사용 되는 것이 옵티마이저(Optimizer)이다.
옵티마이저를 통해 적절한 W와 b를 찾아내는 과정을 머신러닝에서 학습이라고 부른다.
5. 파이토치로 선형 회귀 구현하기
1) 기본 셋팅
import torch
import torch.nn as nn
import torch.nn.functino as F
import torch.optim as optim
torch.manual_seed(1)
2) 변수 선언
x_train = torch.FloatTensor([[1],[2],[3]])
y_train = torch.FloatTensro([[2],[4],[6]])
x_train과 y_train의 크기는 (3*1)이다.
3) 가중치와 편향의 초기화
선형 회귀란 학습 데이터와 가장 잘 맞는 하나의 직선을 찾는 일이다.
이 직선을 정의하는 것이 앞선 W와 b이다.
우선 가중치 W와 편향 b를 0으로 초기화 하자.
# 가중치 W를 0으로 초기화하고 학습을 통해 값이 변경되는 변수임을 명시함.
W = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
위에서 requires_grad=True는 이 변수가 학습을 통해 변경되는 값임을 의미한다.
4) 가설 세우기
H = x_train * W + b
5) 비용 함수 선언하기
# torch.mean으로 평균을 구한다.
cost = torch.mean((hypothesis - y_train) ** 2) # 평균 제곱 오차 선언
6) 경사 하강법 구현하기
optimizer = optim.SGD([W,b], lr=0.01)
optimizer.zero_grad()를 실행하여 미분을 통해 얻은 기울기를 0으로 초기화한다.
이와 같이 기울기를 초기화해야 새로운 가중치 편향에 대해서 새로운 기울기를 구할 수 있다.
그 다음 cost.backward() 함수를 호출하면서 가중치 W와 b에 대한 기울기를 계산한다.
그 다움 경사 하강법 최적화 함수 optimizer.step() 함수를 호출하여 인수로 들어갔던 W와 b에서 리턴되는 변수들의 기울기에 학습률 0.01을 곱하여 빼줌으로서 업데이트 한다.
# gradient를 0으로 초기화
optimizer.zero_grad()
# 비용 함수를 미분하여 gradient 계산
cost.backward()
# W와 b를 업데이트
optimizer.step()
7) 전체 코드
nb_epochs = 1999 # 원하는만큼 경사 하강법을 반복
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()
# 100번마다 로그 출력
if epoch % 100 == 0:
print('Epoch {:4d}/{} W: {:.3f}, b: {:.3f} Cost: {:.6f}'.format(
epoch, nb_epochs, W.item(), b.item(), cost.item()
))
6. optimizer.zero_grad()가 필요한 이유
파이토치는 미분을 통해 얻은 기울기를 이전에 계산된 기울기 값에 누적시키는 특징이 있다. optimizer.zero_grad()를 해주지 않으면 따라서 이를 해주지 않으면 계속하여 기울기가 누적된다.
텐서에는 requires_grad라는 속성이 있다. 이를 True로 설정하면 자동 미분 기능이 적용된다. 선형 회귀부터 신경망과 같은 복잡한 구조에서 파라미터들이 모두 이 기능이 적용된다. requires_grad=True가 적용된 텐서 연산을 하면, 계산 그래프가 생성되며 backward 함수를 호출하면 그래프로부터 자동으로 미분 계산이 된다.
'Background > Pytorch 기초' 카테고리의 다른 글
| 커스텀 데이터셋 (Custom Dataset) (0) | 2022.01.16 |
|---|---|
| 미니 배치와 데이터 로드 (Mini Batch and Data Load) (0) | 2022.01.16 |
| 클래스로 파이토치 선형회귀 모델 구현하기 (0) | 2022.01.14 |
| nn.Module로 구현하는 선형회귀 (0) | 2022.01.14 |
| 다중 선형 회귀(Multivariable Linear Regression) (0) | 2022.01.14 |