UOMOP

Functional API 본문

Ai/DL

Functional API

Happy PinGu 2022. 2. 6. 01:31
  1. module 호출
  2. 함수 생성
  3. 데이터 불러오기
  4. 0~1 함수 적용
  5. one hot encoding
  6. 학습/검증/테스트 데이터 분리
  7. 모델 생성
  8. 모델 설정
  9. 모델 학습
  10. 학습/검증 셋으로 성능 비교
  11. 테스트 셋을 통한 성능 확인

1. module 호출

import matplotlib.pyplot as plt
import numpy as np

from sklearn.model_selection import train_test_split
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.layers import Input, Flatten, Dense
from tensorflow.keras.models import Model
from tensorflow.keras.datasets import fashion_mnist
from tensorflow.keras.optimizers import Adam

2. 함수 생성

# 0~1로 변경

def make_zero_to_one(images, labels) :
    
    scaled_images = np.array(images/255., dtype = np.float32)
    scaled_labels = np.array(labels, dtype = np.float32)
    
    return scaled_images, scaled_labels
    
    
    
    
# one-hot encoding

def ohe(labels) :
    
    oh_labels = to_categorical(labels)
    
    return oh_labels
    
    
    
    
# 데이터 분리
    
def seperate_3(train_images, train_labels, test_images, test_labels, val_rate) :
    
    tr_images, val_images, tr_labels, val_labels = train_test_split(train_images, 
                                                          train_labels, test_size = val_rate)
    
    return (tr_images, tr_labels), (val_images, val_labels), (test_images, test_labels)
    
    
    
    
# Functional API 모델 생성하기

def create_model(input_data) :
    
    input_size = (input_data[0, :, :].shape)[0]
    input_tensor = Input(shape = (input_size, input_size))
    x = Flatten()(input_tensor)
    x = Dense(100, activation = "relu")(x)
    x = Dense(30, activation = "relu")(x)
    output = Dense(10, activation = "softmax")(x)
    
    model = Model(inputs = input_tensor, outputs = output)
    
    return model

3. 데이터 불러오기

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

4. 함수 적용

# 0~1
train_images, train_labels = make_zero_to_one(train_images, train_labels)
test_images, test_labels   = make_zero_to_one(test_images, test_labels)


# one-hot encoding
train_labels = ohe(train_labels)
test_labels = ohe(test_labels)


# 데이터 분리
(tr_images, tr_labels), 
(val_images, val_labels), 
(test_images, test_labels) = seperate_3(train_images, train_labels, test_images, test_labels, 
                                                                              val_rate = 0.15)

5. 모델 생성

model = create_model(tr_images)

model.summary()

6. 모델 설정  (최적화(학습률), 손실함수, 성능지표)

model.compile(optimizer = Adam(0.001), loss = "categorical_crossentropy", metrics = ["accuracy"])

7. 모델 학습

result = model.fit(x = tr_images, y = tr_labels, batch_size = 32, epochs = 20,
                                                    validation_data = (val_images, val_labels))


8. 학습/검증 셋으로 성능 비교

fig, axs = plt.subplots(nrows = 1, ncols = 2, figsize = (10, 3))

axs[0].plot(result.history["accuracy"], label = "tr_acc", color = "r")
axs[0].plot(result.history["val_accuracy"], label = "val_acc", color = "b")
axs[0].set_xlabel("epochs")
axs[0].set_ylabel("accuracy")
axs[0].legend()
axs[0].set_title("compare accuracy")


axs[1].plot(result.history["loss"], label = "tr_loss", color = "r")
axs[1].plot(result.history["val_loss"], label = "val_loss", color = "b")
axs[1].set_xlabel("epochs")
axs[1].set_ylabel("loss")
axs[1].legend()
axs[1].set_title("compare loss")

9. 테스트 셋으로 성능 확인

eval = model.evaluate(test_images, test_labels, batch_size = 32, verbose = 1)
print("")
print("test data로 확인해본 model의 loss     : {:.5f}".format(eval[0]))
print("test data로 확인해본 model의 accuracy : {:.5f}".format(eval[1]))

 

 

 

 

***one-hot encoding***

다중 분류를 위한 모델 학습을 하는 것이 목표이다. 이때 다중 분류를 위해서 출력단의 활성화 함수는 "softmax"이고 손실함수는 "categorical_crossentropy"이다.
만약, 손실함수가 "categorical_crossentropy"이면 label을 꼭 one-hot encoding 시켜야한다.
       손실함수가 "sparse_categorical_crossentropy"이면 one-hot encoding 안해도 된다.

 

 

 

 

 

'Ai > DL' 카테고리의 다른 글

feature map size 계산  (0) 2022.02.07
CNN model 생성  (0) 2022.02.06
미니배치 경사 하강법 using algorithm (boston)  (0) 2022.02.01
확률적 경사 하강법 using algorithm (boston)  (0) 2022.02.01
배치 경사 하강법 using keras (boston)  (0) 2022.02.01
Comments