본문 바로가기
Machine Learning

Deep Neural Network, DNN / Keras (python library)

by Nowkeeh Ahc

 심층 신경망 (Deep Neural Network, DNN)은 입력층과 출력층 사이에 여러 개의 은닉층으로 이루어져 아주 깊은 계층을 갖는 인공신경망 모형을 의미한다. DNN은 앞서 살펴본 다층 퍼셉트론의 구조로 이루어져 있으며, 보다 많은 은닉층을 통해 복잡한 비선형 관계를 모형화할 수 있다. 인공신경망에서 계층의 수는 은닉층과 출력층의 총합을 의미하는데, 보통 10개 이상이면 아주 깊은 학습 (Very Deep Learning)이 이루어지기 때문에 이때부터 DNN이라고 한다. 심층 신경망의 원리는 인공신경망과 동일하므로 상세한 설명은 생략하기로 한다. 

[그림 1] 심층 신경망의 구조

 

실습에 앞어서 Keras 라이브러리에 대해 간단히 설명하고자 한다.

 

Keras

 Keras(케라스)는 파이썬으로 작성된 오픈 소스 신경망 라이브러리로 Theano, TensorFlow, Microsoft Cognitive Toolkit(CNTK)을 백엔드 엔진으로 사용한다. 이중 TensorFlow는 Keras의 기본 백엔드 엔진으로서 심볼릭 연산과 그래프 연산 모형, GPGPU (General-Purpose computing on Graphics Processing Units)를 사용한 연산 등을 제공하기 때문에 대량 연산을 필요하는 딥러닝 학습에 필수적이다. 즉, Keras는 TensorFlow를 쉽게 사용할 수 있도록 도와주는 고수준의 라이브러리이기 때문에 미분, 합성곱과 같은 저수준의 연산을 자체적으로 수행하지 않을 수 있다. 본래 Keras는 독립적인 라이브러리였으나, TensorFlow와 통합되어 tensorflow.keras 형식으로 TensorFlow 안에서 Keras를 사용할 수 있게 되었다. Keras는 딥러닝 모형을 간편하게 구축하고 훈련시킬 수 있다는 장점을 가지며, 확장성이 뛰어나고 상용 제품에 사용할 수 있기 때문에 최근 대부분의 딥러닝 작업에 활용되고 있다. 

 TensorFlow를 기반으로 Keras를 사용하기 위해서는 먼저 TensorFlow를 설치해야 하는데, 아나콘다 프롬프트를 관리자 권한 모드로 실행하고 다음 코드를 입력하면 간단히 설치할 수 있다.

pip install tensorflow

 이대로 설치를 마쳐도 TensorFlow 내 Keras를 이용할 수 있지만, 본서에서는 TensorFlow에 포함된 Keras를 사용하지 않고, 독립적으로 Keras를 설치하여 사용할 것이므로 다음 코드를 입력하여 설치를 진행한다.

pip install keras

Keras 라이브러리에 대해 더 자세한 내용은 https://keras.io에서 확인할 수 있다.

 

연습

 

DNN을 활용하여 분류 예측을 해보겠다.

 

1) 변수 지정 및 전처리

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder
from imblearn.over_sampling import SMOTE

#2. 변수 지정(독립변수/종속변수)
df = pd.read_csv('Ashopping.csv', encoding = 'cp949')
X = df[['변수1', '변수2', '변수3','변수4', '변수5']]
Y = df['종속변수']

#3. 데이터 분할(학습용/평가용 데이터 세트)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)

#4. 표준화 및 원핫인코딩
ct = ColumnTransformer([("scaling", StandardScaler(), ['변수1', '변수3', '변수4', '변수5']), ("onehot", OneHotEncoder(sparse = False),['구매금액대'])])
ct.fit(X_train)
X_train=ct.transform(X_train)
X_test=ct.transform(X_test)

 

2) 모형 학습 및 검증

#1. 모듈 및 함수 불러오기
import numpy as np
import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.metrics import Accuracy

#2. 시드값 설정
np.random.seed(0)
tf.random.set_seed(0)

#3. 모형 생성
model = keras.models.Sequential()
model.add(keras.layers.Dense(64, input_dim=7, activation='relu'))
model.add(keras.layers.Dense(64, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))

#4. 학습 과정 설정
model.compile(loss="binary_crossentropy",optimizer='adam', metrics=['accuracy'])

#5. 모형 학습
history = model.fit(X_train, Y_train, validation_split=0.2, epochs=100, batch_size=64, verbose=2)

 

3) 학습 과정 시각화를 통한 학습 횟수 조정

 학습 과정을 시각화하여 모형의 학습 횟수에 따른 성능의 변화과정을 확인하면, 과잉적합을 방지할 수 있는 적절한 반복 횟수를 가늠할 수 있다. 이를 위해 X축으로 학습 횟수 (epoch)를, Y축으로 오차와 정확도를 갖는 2개의 그래프를 학습용 데이터와 검증용 데이터에 각각 적용하여 총 4개의 그래프를 그려보자. 그래프를 작성하는 과정은 이미 앞서 여러 번 진행했으므로 생략한다.

#1. 모듈 및 함수 불러오기
import matplotlib.pyplot as plt

#2. Figure와 Axes 객체 생성
fig, loss_ax = plt.subplots()
acc_ax = loss_ax.twinx()

#3. 오차 (loss) 그래프 그리기
loss_ax.plot(history.history['loss'], 'y', label='train loss')
loss_ax.plot(history.history['val_loss'], 'r', label='val loss')
loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('loss')
loss_ax.legend(loc='lower right')

#4. 정확도 (accuracy) 그래프 그리기
acc_ax.plot(history.history['accuracy'], 'b', label='train acc')
acc_ax.plot(history.history['val_accuracy'], 'g', label='val acc')
acc_ax.set_ylabel('accuracy')
acc_ax.legend(loc='upper right')

plt.show()

 

4) 모형 재학습 및 예측 수행

 모형이 과잉적합 되는 것을 막기 위하여 학습 반복 횟수를 다시 조정하여 모형을 재학습 시켜보겠다.

#1. 모형 재학습
model.fit(X_train, Y_train, epochs=20, batch_size=64, verbose=0)

#2. 모형 예측
Y_pred = np.round(model.predict(X_test, verbose=0),3)
Y_classes = model.predict_classes(X_test, verbose=0)

print("평가용 데이터 세트에 대한 예측 확률\n", Y_pred[:5])
print(" ")
print("평가용 데이터 세트에 대한 예측 클래스\n",Y_classes[:5])

 

5) 모형 평가

train_score = model.evaluate(X_train, Y_train, verbose=0)
test_score = model.evaluate(X_test, Y_test, verbose=0)
print("학습용 데이터 세트 오차와 정확도: {:.3f}, {:.3f}".format(train_score[0], train_score[1]))
print("평가용 데이터 세트 오차와 정확도: {:.3f}, {:.3f}".format(test_score[0], test_score[1]))

 


This post was written based on what I read and studied the book below.

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791195511747

댓글