딥러닝 모델
딥러닝 모델은 다수의 히든층이 있는 모델을 얘기한다. 각 층을 구성하는 요소를 Node/Unit이라 부르고, 모델을 구성하는 층을 Layer라 부르고, 노드 간의 연결 정도(화살표)를 가중치(Weight)라 한다. 숫자가 크면 연결 강도가 크고 작으면 연결 강도가 작은 것이다.
예측값과 실제값 간의 오차값을 최소화하기 위해 오차값을 최소화하기 위해 오차값을 최소화하는 모델의 인자를 찾는 알고리즘을 적용한다. Loss function을 최소화하는 가중치를 찾기 위해 최적화 알고리즘을 적용한다.
딥러닝 모델이 예측값을 구하는 방식을 순전파(Forward propagation)이라 한다. 입력값을 바탕으로 출력값을 계산하는 과정이다. 활성함수는 비선형함수라서, 딥러닝 모델이 비선형적인 데이터에도 적용될 수 있다. 순전파를 사용하면 예측값과 실제값 간의 오차값을 구하여 Loss function를 구할 수 있다. 그 최적화는 경사 하강법(Gradient descent)로 한다.
경사 하강법(Gradient descent)
가중치를 Loss function 값이 작아지게 없데이트 하는 방법이다. 가중치는 Gradient(미분) 값을 사용하여 업데이트를 수행한다. Gradient 값은 각 가중치마다 정해지며, 역전파(Backpropagation)를 통하여 구한다.
역전파(Backpropagation)
순전파(Forward propagation)의 반대 방향으로 이루어지는 과정이다. 각 과정을 거치면서 각 가중치가 Y에 영향을 미친 정도를 구할 수 있게 되고, 그 영향도를 gradient로 사용할 수 있는 것이다.
딥러닝 모델의 학습 순서는 다음과 같다.
- 학습용 feature 데이터를 입력하여 예측값 구하기 (순전파)
- 예측값과 실제값 사이의 오차 구하기 (Loss 계산)
- Loss를 줄일 수 있는 가중치 업데이트 하기 (역전파)
- 1~3번 반복으로 Loss를 최소로 하는 가중치 얻기
텐서플로우(TensorFlow)
유연하고 효율적이며 확정성 있는 딥러닝 프레임워크로, 대형 클러스터 컴퓨터부터 스마트폰까지 다양한 디바이스에서 동작 가능하다. 강의에선 텐서플로우를 래핑한 Keras를 사용했다. 텐서플로우의 패키지로 제공되는 고수준 API로 딥러닝 모델을 간단하고 빠르게 구현 가능하다.
데이터 전 처리
Tensorflow 딥러닝 모델은 Tensor 형태의 데이터를 입력 받는다. Tensor란 다차원 배열로서 tensorflow에서 사용하는 객체이다. 따라서 데이터를 다룰려면 Tensor 형태로 데이터를 변환하는 과정이 필요하다. 딥러닝에서 사용하는 데이터는 추가적인 전 처리 작업이 필요하다.
Epoch와 Batch
Epoch은 전체 데이터 셋에 대해 한 번 학습을 완료한 상태를 말한다.
학습 과정에서 Data set 전체를 한번에 넣지 않고 나눠서 넣는데, 나눈 조각 하나의 크기를 Batch size라 하고, 그 데이터 자체를 mini-batch라고 부른다. Batch는 나눠진 데이터 셋인 것이다. iteration은 epoch를 나누어서 실행하는 횟수를 의미한다. 예를 들어 10개의 mini-batch로 이루어진 data set을 1 Epoch 학습했으면 10 iteration 동안 학습한 것이다.
딥러닝 모델 구축을 위한 Keras 메소드
모델 클래스 객체 생성
tf.kreas.models.Sequential()
모델의 각 Layer 구성
tf.keras.layers.Dense(units, activaiton)
units은 레이어 안의 Node 수이고, activation은 적용할 활성함수를 설정한다.
Input Layer의 입력 형태 지정하기
첫 번째 Layer인 Input Layer는 입력 형태에 대한 정보를 필요로 한다. input_shape / input_dim 인자로 설정한다.
model = tf.kreas.models.Sequential([
tf.keras.layers.Dense(10, input_dim=2, activaiton='sigmoid'), # 2개의 입력 변수, 10개의 노드
tf.kreas.layers.Dense(10, activation='sigmoid') # 10개의 노드
tf.kreas.layers.Dense(1, activaiton='sigmoid') # 1개의 노드
])
input_shape 인자에는 (입력하는 변수의 개수, )로 입력한다.
모델에 Layer 추가하기
[model].add(tf.keras.layers.Dense(units, activation))
모델 학습 방식을 설정하기 위한 함수
[model].compile(optimizer, loss)
optimizer은 모델 학습 최적화 방법으로 adam, sgd 등으로 해주면 되고, loss는 손실 함수를 설정하면 된다.
loss는 회귀에서는 일반적으로 MSE인 'mean_squared_eror', 분류에서는 'sparse_categorical_crossentropy'를 주로 사용한다.
모델을 학습시키기 위한 함수
[model].fit(x, y)
x는 학습 데이터, y는 학습 데이터의 label을 의미한다.
verbose 인자는 학습 시, 화면에 출력되는 형태를 설정합니다.
(0 : 표기 없음, 1 : 진행 바, 2 : 에포크 당 한 줄 출력)
모델을 평가하기 위한 메소드
[model].evaluate(x, y)
x는 테스트 데이터이고, y는 테스트 데이터의 label을 의미한다.
evaluate() 메서드는 학습된 모델을 바탕으로 입력한 feature 데이터 $X$와 label $Y$의 loss값과 metrics 값을 출력한다. 아래 코드에서는 metrics를 compile에서 설정하지 않았지만, 분류에서는 일반적으로 accuracy를 사용하여 evaluate 사용 시, 2개의 아웃풋을 리턴한다. metrics 인자는 에포크마다 계산되는 평가 지표를 의미한다. 정확도를 의미하는 'accuracy'를 입력하면 에포크마다 accuracy를 계산하여 출력한다.
모델로 예측을 수행하기 위한 함수
[model].predict(x)
x는 예측하고자 하는 데이터를 의미한다.
회귀 문제 신경망 모델
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
np.random.seed(100)
tf.random.set_seed(100)
# 데이터를 DataFrame 형태로 불러 옵니다.
df = pd.read_csv("data/Advertising.csv")
# DataFrame 데이터 샘플 5개를 출력합니다.
print('원본 데이터 샘플 :')
print(df.head(),'\n')
# 의미없는 변수는 삭제합니다.
df = df.drop(columns=['Unnamed: 0'])
X = df.drop(columns=['Sales'])
Y = df['Sales']
# 학습용 테스트용 데이터로 분리합니다.
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.3)
# Dataset 형태로 변환합니다.
train_ds = tf.data.Dataset.from_tensor_slices((train_X.values, train_Y))
train_ds = train_ds.shuffle(len(train_X)).batch(batch_size=5)
# keras를 활용하여 신경망 모델을 생성합니다.
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_shape=(3,)), # 입력하는 변수의 개수가 3개
tf.keras.layers.Dense(1) # 회귀 분석이기에 마지막 레이어의 유닛 수는 1개
])
# 학습용 데이터를 바탕으로 모델의 학습을 수행합니다.
model.compile(loss='mean_squared_error', optimizer='adam')
history = model.fit(train_ds, epochs=100, verbose=2)
# evaluate 메서드를 사용하여 테스트용 데이터의 loss 값을 계산합니다.
loss = model.evaluate(test_X, test_Y, verbose=0)
# predict 메서드를 사용하여 테스트용 데이터의 예측값을 계산합니다.
predictions = model.predict(test_X)
# 결과를 출력합니다.
print("테스트 데이터의 Loss 값: ", loss)
for i in range(5):
print("%d 번째 테스트 데이터의 실제값: %f" % (i, test_Y.iloc[i]))
print("%d 번째 테스트 데이터의 예측값: %f" % (i, predictions[i][0]))
분류 문제 신경망 모델(네 가지 변수와 세 종류의 붓꽃 클래스)
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
np.random.seed(100)
tf.random.set_seed(100)
# sklearn에 저장된 데이터를 불러 옵니다.
X, Y = load_iris(return_X_y = True)
# DataFrame으로 변환
df = pd.DataFrame(X, columns=['꽃받침 길이','꽃받침 넓이', '꽃잎 길이', '꽃잎 넓이'])
df['클래스'] = Y
X = df.drop(columns=['클래스'])
Y = df['클래스']
# 학습용 평가용 데이터로 분리합니다
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2, random_state = 42)
# Dataset 형태로 변환합니다.
train_ds = tf.data.Dataset.from_tensor_slices((train_X.values, train_Y))
train_ds = train_ds.shuffle(len(train_X)).batch(batch_size=5)
"""
keras를 활용하여 신경망 모델을 생성합니다.
3가지 범주를 갖는 label 데이터를 분류하기 위해서 마지막 레이어 노드를 아래와 같이 설정합니다.
"""
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(10, input_dim=4),
tf.keras.layers.Dense(3, activation='softmax')
])
# 학습용 데이터를 바탕으로 모델의 학습을 수행합니다.
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(train_ds, epochs=100, verbose=2)
# 테스트용 데이터를 바탕으로 학습된 모델을 평가합니다.
loss, acc = model.evaluate(test_X, test_Y)
# 테스트용 데이터의 예측값을 구합니다.
predictions = model.predict(test_X)
# 결과를 출력합니다.
print("테스트 데이터의 Accuracy 값: ", acc)
for i in range(5):
print("%d 번째 테스트 데이터의 실제값: %d" % (i, test_Y.iloc[i]))
print("%d 번째 테스트 데이터의 예측값: %d" % (i, np.argmax(predictions[i])))
'AI / DL > 엘리스 AI 데이터 분석 트랙' 카테고리의 다른 글
[AI 데이터 분석] 딥러닝 시작하기 03. 다양한 신경망 (2) (0) | 2022.10.09 |
---|---|
[AI 데이터 분석] 딥러닝 시작하기 03. 다양한 신경망 (1) (0) | 2022.10.08 |
[AI 데이터 분석] 딥러닝 시작하기 01. 퍼셉트론 (0) | 2022.10.08 |
[AI 데이터 분석] 머신러닝 시작하기 04. 지도학습 - 분류 (0) | 2022.10.07 |
[AI 데이터 분석] 머신러닝 시작하기 03. 지도학습 - 회귀 (0) | 2022.10.07 |
댓글