gradientDescent

ro_ot ㅣ 2020. 1. 29. 20:07

 

%tensorflow_version 2.x  # 강제로 2.x 버전으로 사용하는 명령어
import tensorflow as tf
tf.__version__ # 1.15도 실제로는 내부구현이 tensorflow 2.0과 동일 합니다.

'2.1.0'

경사하강법 : Gradient Descent Optimization

  • 경사 : 미분하면 경사를 구할 수 있습니다.
x = [1,2,3,4,5.0] # 실수를 만들기 위해 .0 하나 붙였습니다.
y = [3,5,7,9,11.0]
# y = x * x + b
w = tf.Variable(10.0) # 변수 : 학습되는 파라미터, 초기값 1.0
b = tf.Variable(0.0) # 초기값 0

* tf.Variable() : 변수(학습 파라미터)

for i in range(500):
  with tf.GradientTape() as tape: # 경사 기록 장치 : 이 안에서 수행되는 연산의 경사가 기록됩니다.
    h = w * x + b # (Hyperthesis 가설, 예측)
    cost = tf.reduce_mean(tf.square(h - y)) # Mean 평균 Square제곱 Error 오차
  w_grad, b_grad = tape.gradient(cost, [w,b])
  w_grad
  learning_rate = 0.01
  w.assign_sub(learning_rate * w_grad)
  b.assign_sub(learning_rate * b_grad)
w,b,

* with tf.GradientTape() as tape : 경사 기록 장치

x = [1,2,3,4,5.0]
y = [3,5,7,9,11.0]
#model = keras.Sequencial() # 기본적.기초적인 사용법이라 커스터마이징이 어렵습니다
import tensorflow as tf
from tensorflow import keras
import numpy as np
class SimpleModel(keras.Model):
  def __init__(self):
    super(SimpleModel, self).__init__()
    print('init')
    self.dense_0 = keras.layers.Dense(1)  # dense:fully connected layer 완전 연결 층
    self.optimizer = tf.optimizers.SGD(learning_rate=0.01)
  def call(self, x):
    h = self.dense_0(x)
    h = tf.squeeze(h, axis=1) # (m, 1) 을 (m) 으로 차원축소합니다
    return h  
  def loss(self, y, h):
    return tf.reduce_mean(tf.square(y-h))
  def update(self, x, y):
    with tf.GradientTape() as tape:
      h = self.call(x)
      cost = self.loss(y, h)
    grads = tape.gradient(cost, self.trainable_variables)
    self.optimizer.apply_gradients(zip(grads, self.trainable_variables))# 통합:concat, stack, zip
    return cost, grads 
    
model = SimpleModel()

 init

* def : 예약어로써 함수를 정의 할 때 사용한다.

* __init__ : python에서 쓰이는 생성자

* self : 인스턴스 그자체로 메소드 정의시 사용해야하며 해당 메소드를 불러올 때 self 는 자동으로 전달됨

* super : 자식 클래스에서 부모클래스의 내용을 사용하고 싶을 경우 사용

   └ 먼저 super를 사용전 상속, 오버라이딩의 개념 화긴 필수

* optimizers : 최적화

* squeeze() : 차원 축소

* reduce_mean() : 특정 차원을 제거하고 평균을 구한다.

* tape.gradient() : 자동으로 미분을 구하는 함수

  └ gradient : 기울기

* apply_gradients() : gradient 값을 통하여 w 값을 얻어내기 위한 그래프 생성

x_2d = np.array(x).reshape([-1, 1]).astype(np.float32)
y = np.array(y).astype(np.float32)
for i in range(100):
  model.update(x_2d, y)
print('finish', model.trainable_variables) # 값 확인

'Deep learning > Code' 카테고리의 다른 글

keras_cnn_expert  (0) 2020.01.30
keras_logistic_regression_expert  (0) 2020.01.29
Convolution  (0) 2020.01.29
Multi-class  (0) 2020.01.29
분류2 classification  (0) 2020.01.28