선형 회귀 구현 텐서플로와 파이토치 구현 비교
데이터 선언 비교
TF.2
x_data = [11,12,13,14,15,16,17]
y_data = [148, 154, 170, 165, 175, 183, 190]
PyTorch
x_data = torch.FloatTensor([[11], [12], [13], [14], [15], [16], [17]])
y_data = torch.FloatTensor([[148], [154], [170], [165], [175], [183], [190]])
= 텐서플로의 경우, 파이썬 리스트 형식이나 넘파이 리스트를 받아서 사용하지만, 파이토치에서는 텐서의 값으로 사용
가중치(w)와 편향(b) 비교
TF.2
w = tf.Variable(tf.random.normal([1]))
b = tf.Variable(tf.random.normal([1]))
new_w, new_b = tape.gradient(cost, [w, b])
w.assign_sub(learning_rate * new_w)
b.assign_sub(learning_rate * new_b)
PyTorch
w = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
= w, b 선언은 같음. 각 프레임워크 형식에 맞는 변수 설정
이후, w와 b를 학습 중에 업데이트하는데,
텐서플로에서는 학습 진행 시, 새로운 w와 b를 선언하여 대체하는 방식을 코드로 구현
파이토치에서는 requires_grad=True라는 옵션을 추가하여 TF2와 같은 방식을 구현
옵티마이저, cost function 비교
TF.2
with tf.GradientTape() as tape:
cost = tf.reduce_mean(tf.square(hypothesis - y_data))
PyTorch
optimizer = optim.SGD([w,b], learning_rate)
cost = torch.mean((hypothesis - y_data)**2)
optimizer.zero_grad()
cost.backward()
optimizer.step()
= 옵티마이저는 각 프레임워크의 함수(경사 하강법) 사용.
파이토치에서는
optimizer.zero_grad()를 통해 미분 값(gradient)을 0으로 초기화하고,
cost.backward() 초기화된 미분 값을 가지고, cost 함수에 대입하여 미분값을 구하고,
optimizer.step()을 통해서, w와 b의 값을 업데이트
텐서플로에서는
앞서 가중치/편향 비교에서 설명한 것처럼 w와 b값을 업데이트
전체 코드 비교
import torch
import torch.optim as optim
import tensorflow as tf
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
텐서플로
x_data = [11,12,13,14,15,16,17]
y_data = [148, 154, 170, 165, 175, 183, 190]
w = tf.Variable(tf.random.normal([1]))
b = tf.Variable(tf.random.normal([1]))
learning_rate = 0.0005
for i in range(50001):
with tf.GradientTape() as tape:
hypothesis = w * x_data + b
cost = tf.reduce_mean(tf.square(hypothesis - y_data))
new_w, new_b = tape.gradient(cost, [w, b])
w.assign_sub(learning_rate * new_w)
b.assign_sub(learning_rate * new_b)
if i % 500 == 0:
print(f'Step : {i}, Cost : {int(cost)}, Weight : {w.numpy()[0]}, Bias : {b.numpy()[0]}')
temp_x = 18
print()
print(f"온도가 {temp_x}도 일 때, 에어컨 판매 예상 갯수 :", int(w * temp_x + b))
파이토치
x_data = torch.FloatTensor([[11], [12], [13], [14], [15], [16], [17]])
y_data = torch.FloatTensor([[148], [154], [170], [165], [175], [183], [190]])
w = torch.zeros(1, requires_grad=True) # True > 학습할 것이라고 명시
b = torch.zeros(1, requires_grad=True)
learning_rate = 0.0005
optimizer = optim.SGD([w,b], learning_rate)
for i in range(50001) :
hypothesis = w * x_data + b
cost = torch.mean((hypothesis - y_data)**2)
optimizer.zero_grad()
cost.backward()
optimizer.step()
if i % 500 == 0 :
print(f'Step : {i}, Cost : {cost.item()}, Weight : {w.item()}, Bias : {b.item()}')
temp_x = 18
print()
print(f"온도가 {temp_x}도 일 때, 에어컨 판매 예상 갯수 :", int(w * temp_x + b))
파이토치(with nn_module)
import torch.nn as nn :
nn.Module 이란, 파이토치에서 이미 구현되어 있는 모델들이 저장되어 있어 우리는 모듈을 부르고 모델들을 사용할 수 있습니다.
model = nn.Linear(입력dim, 출력dim)
을 넣어 사용하면 파이토치에서 이미 구현한 선형회귀 모델을 사용할 수 있습니다.
저는 직관적으로 표현하기 위해, (또는 경우에 따라서 모델을 수정할 수 있도록) Class화 시켜서 구현하였습니다.
LinearRegressionModel을 따로 만들고, 이 모델을 호출하겠습니다.
model = LinearRegressionModel()
import torch.nn.functional as F :
또한, nn.functional 에는 여러가지 cost function들이 저장되어 있습니다. F.mse_loss를 통해서 mse cost function을 사용하여 코드로 구현하였습니다.
class LinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(1, 1)
def forward(self, x):
return self.linear(x)
x_data = torch.FloatTensor([[11], [12], [13], [14], [15], [16], [17]])
y_data = torch.FloatTensor([[148], [154], [170], [165], [175], [183], [190]])
learning_rate = 0.0005
model = LinearRegressionModel()
optimizer = optim.SGD(model.parameters(), learning_rate)
for i in range(50001) :
prediction = model(x_data)
cost = F.mse_loss(prediction, y_data)
optimizer.zero_grad()
cost.backward()
optimizer.step()
if i % 500 == 0 :
params = list(model.parameters())
w = params[0].item()
b = params[1].item()
print(f'Step : {i}, Cost : {cost.item()}')
temp_x = 18
temp_x_2 = 1
print()
print(f"온도가 {temp_x}도이며 프로모션 진행여부 {temp_x_2} 일 때, 에어컨 판매 예상 갯수 :", int(w * temp_x + b))
'AI > PyTorch' 카테고리의 다른 글
PyTorch-실습 : 파이토치 로지스틱 회귀 구현(vs TF) (0) | 2020.09.16 |
---|---|
PyTorch-실습 : 파이토치 다중 선형 회귀 구현(vs TF) (0) | 2020.09.16 |
PyTorch-실습 : Tensor 조작하기(2) (0) | 2020.09.16 |
PyTorch-실습 : Tensor 조작하기(1) (0) | 2020.09.16 |
PyTorch-실습 : NumPy & Torch (Tensor) (0) | 2020.09.16 |