대학생활/수업

게임인공지능 10주차 - TensorFlow and keras, Linear Regression

se.jeon 2023. 11. 7. 13:07
728x90
반응형

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

 

728x90
반응형