In [ ]:
import torch
X = [1, 2, 3, 4, 5]
Y = [5, 10, 15, 20, 25]
X = [[i] for i in X]
Y = [[i] for i in Y]
x_data = torch.Tensor(X)
y_data = torch.Tensor(Y)
# tensor 타입은 torch.FloatTensor로 표시된다.
x_data.type()
In [ ]:
y_data.type()
In [ ]:
x_data
In [ ]:
y_data
LinearRegressionModel의 구성¶
- torch.nn.Module : 모든 신경망 모듈의 기초. 이 클래스를 서브클래싱(슈퍼클래스에 구현된 코드와 내부 표현 구조를 하위 클래스가 이어받는 것)해야 한다.
- torch.nn.Linear(각 입력 샘플의 크기, 각 출력 샘플의 크기, bias = False(레이어가 추가 편향을 학습하지 않음)/True) : 투입된 데이터에 선형 변환을 적용한다. TensorFloat32를 지원한다.
In [ ]:
# 제작하고자 하는 "LinearRegressionModel"에 "torch.nn.Module"을 넣는다.
class LinearRegressionModel(torch.nn.Module):
# 생성자
def __init__(self, input_dim, output_dim):
# torch.nn.Module의 (LinearRegressionModel)를 상속받는다.
super(LinearRegressionModel, self).__init__()
# 입력샘플의 크기 input_dim과 출력샘플의 크기 output_dim 데이터에 선형변환을 적용한다.
self.linear = torch.nn.Linear(input_dim, output_dim)
def forward(self, x):
y_pred = self.linear(x)
return y_pred
model = LinearRegressionModel(1, 1)
- torch.nn.MSELoss() : MSE 측정 기준 형성.
- torch.optim.SGD(param, lr =
....) : stochastic gradient descent를 구현
In [ ]:
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
In [ ]:
for epoch in range(10001):
pred_y = model(x_data)
loss = criterion(pred_y, y_data)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 1000 == 0:
print("[ epoch: %d, cost: %.2f ]" % (epoch, loss.data))
print("w = %.2f, b = %.2f" % (model.linear.weight, model.linear.bias))
print("f(x) = %.2fx + %.2f" % (model.linear.weight, model.linear.bias))
print("예측값: [%.2f]" % (model(torch.Tensor([[6]]))))
- optimizer.zero_grad() : 최적화된 torch.Tensor의 기울기를 모두 0으로 만든다. 초기화의 의미가 강한 것으로 추정.
- loss.backward() : error를 역전파한다. 기존 계산된 변화도 값을 누적시키지 않기 위해서 사용한다. 역시 초기화의 의미가 강한 것으로 추정.
- optimizer.step() : 기울기가 한번 계산될 때마다 호출될 수 있는 함수.
<내일 학습방향>
- 위 예제의 구조를 아직도 이해하지 못하여 금일 학습은 종료함. (1) 왜 "LinearRegressionModel(torch.nn.Module)"의 인자는 (1, 1)을 받을 수 있는 것인지, (2) LinearRegressionModel이라는 객체를 만들었음에도 이것을 model값으로 저장하고, 이것을 다시 pred_y로 저장하는 삼중의 구조를 거쳤는지 등 아직도 많은 의문점이 남아있음.
- 제공받은 예제를 뜯어보면서 Pytorch 구조를 이해하는데 많은 도움은 받지 못함.
- Pytorch 홈페이지 튜토리얼을 처음부터 살펴보는 편이 나을 것으로 판단됨.
'전문지식 함양 > TIL' 카테고리의 다른 글
[프로그래머스 겨울방학 인공지능 과정] python 풍경 이미지분류 알고리즘의 구현2 (0) | 2022.01.27 |
---|---|
[프로그래머스 겨울방학 인공지능 과정] python 풍경 이미지분류 알고리즘의 구현1 (0) | 2022.01.26 |
[프로그래머스 겨울방학 인공지능 과정] 딥러닝 기초이론 (0) | 2022.01.24 |
[프로그래머스 겨울방학 인공지능 과정] numpy 복습 및 심화문제 (0) | 2022.01.20 |
[프로그래머스 겨울방학 인공지능 과정] np.where (0) | 2022.01.19 |