선형 회귀 구현 텐서플로와 파이토치 구현 비교

데이터 선언 비교

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

 

반응형

+ Recent posts