게임인공지능 10주차 - TensorFlow and keras, Linear Regression
TensorFlow
TensorFlow는 데이터 흐름 그래프를 사용하는 수치 연산용 오픈소스 소프트웨어 라이브러리이다.
Tensor : 데이터 뭉치
그래프의 노드(node) : 수학적 연산을 나타낸다
그래프의 변(edge) : 노드 간에 전달되는 다차원 데이터 배열(텐서)을 나타낸다.
Tensors : 다차원 배열 또는 벡터 등을 일반화한 자료구조
Types of tensors : tf.Variable, tf.constant, tf.SparseTensor
TensorFlow : Tensor를 포함하는 계산을 정의하고 실행하는 프레임워크
Python을 기반으로 진행.
텐서플로우를 사용하려면 모듈을 임포트 해 주어야 한다.
import tensorflow as tf
node1 = tf.constant(3.0, tf.float32)
node2 = tf.constant(4.0)
node3 = tf.add(node1, node2)
print(node1, node2, node3)
# 결과 : 3.0, 4.0, 7.0
Rank : the number of dimensions order, degree, n-dimension
https://www.tensorflow.org/guide/tensors (현재는 삭제됨)
Keras
Keras : 텐서플로우의 딥러닝 모델 설계와 훈련을 위한 고수준(high-level) API
Keras 모델 특징
- 사용자 친화적 : 일반 사용 사례에 최적화된 간단하고 일관적인 인터페이스 제공
- 모듈화 및 구성 가능성 : 구성 요소의 설정에 의해 연결되는 형식
- 쉬운 확장
Sequential 모델 구성 : layer를 조합하여 model을 만듦
from keras import models
from keras import layers
model = models.Sequential()
# 64개의 유닛을 가진 완전 연결 층을 모델에 추가합니다.
model.add(layers.Dense(64, activation='relu'))
# 또 하나를 추가합니다.
model.add(layers.Dense(64, activation='relu'))
# 10개의 출력 유닛을 가진 소프트맥스 층을 추가합니다.
model.add(layers.Dense(10, activation='softmax'))
훈련과 평가 : compile 메소드를 호출하여 학습과정 설정
model = models.Sequential([
# 64개의 유닛을 가진 완전 연결 층을 모델에 추가합니다:
layers.Dense(64, activation='relu', input_shape=(32,)),
# 또 하나를 추가합니다:
layers.Dense(64, activation='relu'),
# 10개의 출력 유닛을 가진 소프트맥스 층을 추가합니다:
layers.Dense(10, activation='softmax
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
loss='categorical_crossentropy',
metrics=['accuracy'])
# 평균 제곱 오차로 회귀 모델을 설정합니다.
model.compile(optimizer=tf.keras.optimizers.Adam(0.01),
loss='mse', # 평균 제곱 오차
metrics=['mae']) # 평균 절댓값 오차
# 크로스엔트로피 손실 함수로 분류 모델을 설정합니다.
model.compile(optimizer=tf.keras.optimizers.RMSprop(0.01),
loss=tf.keras.losses.CategoricalCrossentropy(),
metrics=[tf.keras.metrics.CategoricalAccuracy()])
머신러닝에서는 w값을 찾아내는 것이 중요하다.
훈련과 평가 : compile 메소드를 호출하여 학습과정 설정 -> fit 메소드 호출 훈련
import numpy as np
data = np.random.rand((1000, 32))
labels = np.random.rand((1000, 10))
model.fit(data, labels, epochs=10, batch_size=32)
import numpy as np
data = np.random.rand((1000, 32))
labels = np.random.rand((1000, 10))
val_data = np.random.rand((100, 32))
val_labels = np.random.rand((100, 10))
model.fit(data, labels, epochs=10, batch_size=32,
validation_data=(val_data, val_labels))
평가와 예측 : 주어진 데이터로 추론 모드의 손실이나 지표를 평가
data = np.random.rand ((1000, 32))
labels = np.random.rand ((1000, 10))
model.evaluate(data, labels, batch_size=32)
model.evaluate(dataset, steps=30)
result = model.predict(data, batch_size=32)
print(result.shape
# package import
import tensorflow as tf
import numpy as np
# Training set 초기화
x_train = [1,2,3]
y_train = [1,2,3]
# Tensorflow Keras model을 생성
tf.model = tf.keras.Sequential()
# Keras model에 계층(layer) 추가
tf.model.add(tf.keras.layers.Dense(units=1, input_dim = 1))
# 최적화 알고리즘 설정
sgd = tf.keras.optimizers.SGD(learning_rate=0.01)
# 학습 과정 설정 (compile)
tf.model.compile(loss='mse', optimizer=sgd)
# model 출력
tf.model.summary()
# 학습 진행
tf.model.fit(x_train, y_train, epochs=200)
# 새로운 입력 데이터에 대해 예측
y_predict = tf.model.predict(np.array([1.5, 4.5]))
print(y_predict)
Linear Regression (선형회귀)
선형회귀 : 두 변수와의 선형 관계를 모델링하는 기법이다. 선형 예측 함수를 사용하여 모델링한다.
시간에 따른 점수 예측의 경우
Cost Function : 손실 함수
H(x) - Wx + b 직선이 Training data에 적합하게 하려면 손실(Error)의 합이 최소가 되도록 하는 W, b 값을 구해야한다.
손실 : H(x) - y
오차가 제일 적은 경우의 W를 구하여 직선의 방정식을 만든다.
Gradient descent algorithm (경사하강법)
- Cost function을 최소화하는 방법
- 경사하강법은 많은 최소화 문제에 적용됨
- Cost(W, b)를 최소화하는 W, b를 찾아야 함
- General cost function : cost (w1, w2, ...)
- Start with inital guesses : 조금씩 W,b를 변화시키면서 cost(W, b)를 감소시킨다.
- Each time you change the parameters, you select the gradient witch reduces cost(w, b) the most possible
- Repeat
- Local minimum에 수렴할 때까지 위 과정을 수행한다.
Convex function
The loss curve (손실 곡선)
Multivariable Linear Regression
잘 모르겠음...
옵티마이저(Optimizer/ 최적화 알고리즘)
경사하강법은 w의 값을 조금씩 조정하면서 예측값과 실제값 사이의 손실(오차)를 줄여 나가는
최적화 알고리즘의 한 종류이다.
머신러닝 프레임워크에는 학습률을 자동으로 조정해 주는 옵티마이저들이 있다.
- Adam
- Adgrad
- RMSprop
- SGD
실습 진행
import numpy as np
import matplotlib.pyplot as plt
w = -2
b = 40
# Sample data
# y : label (정답)
x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
y = np.array([10,20,25,30,40,45,40,50,60,55])
# y_hat : hypothesis (예측값)
y_hat = x * w + b
print('y_hat : ', y_hat)
plt.plot(x, y, '.')
plt.plot(x, y_hat, '-')
plt.show()
선형 회귀 방식을 통하여 학습 진행
## lr : learning_rate
## epochs : 총 학습횟수
lr = 0.03
epochs = 101
# weights : w의 값들을 저장 리스트
# losses : 손실값들을 저장할 리스트
weights = []
losses = []
# 학습 진행
for i in range(epochs) :
y_hat = w * x + b
error = y - y_hat
loss = np.sum((y-y_hat)**2)/len(x)
print('loss = ', loss)
# w_diff : 기울기 - error를 w로 편미분
# b_diff : 절편 - error를 b로 편미분
w_diff = -(2/len(x)) * sum(x * (error))
b_diff = -(2/len(x)) * sum(error)
# update w, b
w = w - lr * w_diff
b = b - lr * b_diff
if i % 20 == 0 :
print("epoch=%.f, w=%.4f, b=%.4f, w_diff=%.4f, b_diff=%.4f" % (i, w, b, w_diff, b_diff))
weights.append(w)
losses.append(loss)
plt.subplot(1,2,1)
plt.plot(x, y, '.')
plt.plot(x, y_hat, '-')
plt.subplot(1,2,2)
plt.plot(losses, 'o-')
plt.tight_layout()
plt.show()
손실 결과 분석
y_hat = w * x + b
plt.scatter(x,y)
plt.plot(x,y,'.')
plt.plot(x,y_hat, '-')
plt.plot(weights, losses)
plt.show()