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