본문 바로가기

인공지능/딥러닝

[딥러닝DL] 심층신경망(DNN) 훈련 및 성능향상 - verbose, epoch, history, 시각화

~ 목차 ~

 
 

목차

1. 라이브러리 정의

2. 데이터 수집 및 정규화

3. 심층신경망(Deep Neural Network, DNN)

4. 훈련 출력방법 지정

5. 모델 추가 정보

6. 시각화 하기

 

 

사용할 라이브러리 정의🦄

import tensorflow as tf
from tensorflow import keras

import matplotlib.pyplot as plt
import numpy as np

from sklearn.model_selection import train_test_split

"""실행 결과를 동일하게 하기 위한 처리(완전 동일하지 않을 수도 있음)"""
tf.keras.utils.set_random_seed(42)

"""연산 고정"""
tf.config.experimental.enable_op_determinism()

 

 

데이터 수집 및 정규화 🦄

패션 MNIST 데이터 읽어들이기(훈련 및 테스트 데이터)

(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()

print(train_input.shape , train_target.shape)
print(test_input.shape , test_target.shape)

 

(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)

 

정규화하기

train_scaled_255 = train_input / 255.0
test_scaled_255 = test_input / 255.0
train_scaled_255.shape, test_scaled_255.shape

 

((60000, 28, 28), (10000, 28, 28))

 

훈련 및 검증으로 분류하기

train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled_255, train_target,
                                                                     test_size=0.2,
                                                                     random_state=42)
print(train_scaled.shape, train_target.shape)
print(val_scaled.shape, val_target.shape)
print(test_scaled_255.shape, test_target.shape)

 

(48000, 28, 28) (48000,)
(12000, 28, 28) (12000,)
(10000, 28, 28) (10000,)

 

 

심층신경망(Deep Neural Network, DNN) 🦄

 

 

* 인공신경망(Artificial Neural Network, ANN)

- 계층이 1개인 경우 또는 은닉계층이 없는 경우

 

* 심층신경망(Deep Neural Network, DNN)

- 은닉계층을 가지고 있는 경우

 

 

모델 생성시키는 함수 생성하기

 - 함수이름 : model_fn
    → 매개변수 : a_layer 매개변수
    → 은닉계층이 있는 경우 계층자체를 매개변수로 받아서 아래에서 추가
 - 모델생성
 - 입력층(1차원 전처리계층) 추가
 - 100개의 출력을 담당하는 은닉계층 추가, 활성화 함수 relu
 - 추가할 은닉계층이 있으면 추가, 없으면 건너띄기
 - 출력층
 - 모델 반환

def model_fn(a_layer = None):
    
    """모델 생성"""
    model = keras.Sequential()

    """입력층(1차원 전처리계층) 추가"""
    model.add(keras.layers.Flatten(input_shape = (28,28)))

    """100개의 출력을 담당하는 은닉계층 추가, 활성화 함수 relu"""
    model.add(keras.layers.Dense(100, activation="relu"))

    """추가할 은닉계층이 있는 경우만 실행됨"""
    if a_layer:
        model.add(a_layer)

    """출력층"""
    model.add(keras.layers.Dense(10, activation="softmax"))

    """모델 반환"""
    return model
    
    """모델 생성 계층 확인하기"""
    print(f"{model.summary()}")

 

※ 함수 초기값 설정 : a_layer = None
    은닉계층 여러개를 받고 싶다면 매개변수 초기값을 리스트 형태로 받아서 리스트를 for문 돌려야 함

 

 

은닉계층 추가하기

hidden_layer = keras.layers.Dense(50, activation="relu", name = "hidden_layer")
model_fn(hidden_layer)

 

계층 확인하기 - 은닉계층 추가

 

함수 호출하기

model5 = model_fn()
model5

 

계층 확인하기 - 은닉계층 추가 x

 

 

* 모델 생성계층 확인하기 summary()

- param = (입력크기 * 출력크기) + 출력크기
  78500 = (784*100) + 100
  1010 = (100*10) + 10

 

 

모델 설정하기(compile)

model5.compile(loss = "sparse_categorical_crossentropy",
               metrics="accuracy")

 

훈련하기(fit)

model5.fit(train_scaled, train_target, epochs=5)

 

훈련

 


 

훈련 출력방법 지정🦄

 

 

* 훈련 출력방법 지정

- verbose : 출력방법 지정
                 : 0은 아무것도 안나옴(훈련은 되고 있음, 1000~10000번 정도 돌릴때 사용)
                 : 1은 프로그래스바와 함께 loss와 accuracy (디폴트 값)
                 : 2는 loss이 accuracy만 출력(프로그래스바 안나옴)

 

 

훈련 출력방법 지정

 

model5.fit(train_scaled, train_target, epochs=5, verbose=0)

 

verbose=0

 

model5.fit(train_scaled, train_target, epochs=5, verbose=1)

 

verbose=1

model5.fit(train_scaled, train_target, epochs=5, verbose=2)

 

verbose=2

 

 

모델 추가 정보 🦄

 

모델 추가 정보 - epoch

* epoch우리가 몇 번씩 수행했는지에 대한 인덱스 값

history5.epoch

 

[0, 1, 2, 3, 4]

 

모델 추가 정보 - history

* history  딕셔너리 형태의 loss데이터, accuracy데이터 5개씩

history5.history

 

{'loss': [0.20462632179260254, 0.2030731588602066, 0.2021009773015976, 0.19699999690055847, 0.1929694563150406],
 'accuracy': [0.9308958053588867, 0.932812511920929, 0.9330833554267883, 0.9358958601951599,
  0.9361249804496765]}

 

 

시각화 하기 🦄

 

시각화 하기 - 손실율

*

Loss

 :  손실율

import matplotlib.pyplot as plt

plt.title("Epoch5 - Loss")
plt.plot(history5.epoch, history5.history["loss"])
plt.xlabel("epoch")
plt.ylabel("loss")
plt.grid()

"""이미지로 저장 시키기"""
plt.savefig("./saveFig/Epoch5-loss.png")
plt.show()

 

손실율 시각화

 

시각화 하기 - 정확도

* history  딕셔너리 형태의 loss데이터, accuracy데이터 5개씩

"""정확도 시각화 하기"""
plt.title("Epoch5 - accuracy")
plt.plot(history5.epoch, history5.history["accuracy"])
plt.xlabel("epoch")
plt.ylabel("accuracy")
plt.grid()

"""이미지로 저장 시키기"""
plt.savefig("./saveFig/Epoch5-accuracy.png")
plt.show()

 

정확도 시각화

 

 

시각화 함수화 하기

손실율, 정확도 그래프 동시에 나오도록 함수화

def loss_accuracy_plt():
    import matplotlib.pyplot as plt
    graph = ["loss", "accuracy"]

    for i in graph:
        plt.title(f"Epoch5 - {i}")
        plt.plot(history5.epoch, history5.history[f"{i}"])
        plt.xlabel("epoch")
        plt.ylabel(f"{i}")
        plt.grid()
        
        """이미지로 저장 시키기"""
        plt.savefig(f"./saveFig/Epoch5-{i}.png")
        plt.show()

 

* 함수 실행

loss_accuracy_plt()

 

시각화 함수

 

728x90