[딥러닝] Functional API를 이용하여 딥러닝 모델 만들기 !

김영민·2022년 7월 13일
0

DeepLearning

목록 보기
10/27
post-thumbnail

우선, 저는 이때까지 Sequential을 이용하여 모델을 만들어 본 적밖에 없어서, Functional API를 이용하여 만드는 것이 굉장히 생소하였습니다.
그러나, Functional API를 사용하니 훨씬 눈에 잘 들어오고, 세부적으로 설정할 수 있어서 더 좋은 것 같습니다!
이번 게시물에서는 Functional API 실습한 것을 적어보도록 하겠습니다.
data는 fashion_mnist를 활용하겠습니다!

이미지 출처 : https://keras.io/

1. 모델 만들기

from tensorflow.keras.layers import Layer, Input, Dense, Flatten
from tensorflow.keras.models import Model
import tensorflow as tf


INPUT_SIZE = 28
def create_model():
    #모델을 만들 때, Input이라는 값이 들어오는 것은, 한 장의 이미지에 대한 Input만을 작성 , 케라스에서는 알아서 batch로 3차원으로 입력된다고 인식
    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
  • 우선 모델을 만들기 위해 필요한 keras 라이브러리들을 추가해줍니다.
  • Functional API를 사용하기 위해서는 Input이라는 라이브러리가 필요합니다!
  • input 데이터를 Flatten한 것을 x에 저장하고, 그 x가 다시 입력이 되어 첫번째 Dense 층에 들어갑니다.
  • 이런 식으로 x에 저장되고, 그 x가 다시 입력값으로 들어갑니다.
  • 마지막 Model(inputs=input_tensor, outputs=output) 을 통해 모델을 만들어줍니다.

2. 모델 생성 및 summary 확인

model = create_model()
model.summary()
  • .summary()를 통해 모델을 한 눈에 확인 가능

아주 정확하게 들어온 것이 보이죠??
여기에서 param이 784개의 입력값을 받아 100개의 node를 지나면 78400개 아닌가? 라는 의문이 드실 수 있는데요!
node 하나 당 1개의 bias값을 가지고 있어서 78500개인 것입니다!

3. 데이터 전처리 및 train_test_split

import numpy as np
from tensorflow.keras.utils import to_categorical
from sklearn.model_selection import train_test_split

# 0 ~ 1사이값의 float32로 변경하는 함수
def get_preprocessed_data(images, labels):
    images = np.array(images/255.0,dtype= np.float32)
    labels = np.array(labels,dtype = np.float32)
    
    return images, labels
# 0 ~ 1사이값 float32로 변경하는 함수 호출 한 뒤 OHE 적용
def get_preprocessed_ohe(images,labels):
    images, labels = get_preprocessed_data(images,labels)
    oh_labels = to_categorical(labels)
    
    return images,oh_labels

# 학습/검증/테스트 데이터 세트에 전처리 및 OHE 적용한 뒤 반환 

def get_train_valid_test_set(train_images,train_labels,test_images,test_labels,valid_size=0.15,random_state=2021):
    train_images,train_oh_labels = get_preprocessed_ohe(train_images,train_labels)
    test_images,test_oh_labels = get_preprocessed_ohe(test_images,test_labels)
    
    tr_images, val_images, tr_oh_labels, val_oh_labels = train_test_split(train_images,train_oh_labels,test_size=valid_size, random_state = random_state)
    
    return (tr_images,tr_oh_labels),(val_images,val_oh_labels),(test_images,test_oh_labels)
  • get_preprocessed_data(images,labels)
    • 이미지 전처리를 위한 함수
  • get_preprocessed_ohe(images,labels)
    • label을 원-핫 인코딩하기 위한 함수
  • get_train_valid_test_set
    • train 데이터에서 train과 valid를 나누는 함수

4. 데이터 불러오기, 데이터 나누기

from tensorflow.keras.datasets import fashion_mnist
# Fashion MNIST 데이터 재 로딩 및 전처리 적용하여 학습/검증/데이터 세트 생성. 

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

(tr_images,tr_oh_labels),(val_images,val_oh_labels),(test_images,test_oh_labels) = \
    get_train_valid_test_set(train_images,train_labels,test_images,test_labels,valid_size=0.15,random_state=2021)
  • 위 코드를 통해 tr,val,test로 나뉘게 됩니다.

5. 모델 컴파일 및 학습 수행

from tensorflow.keras.optimizers import Adam
# Model 생성 및 optimizer, loss, metric 적용

model = create_model()

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

history = model.fit(x=tr_images, y=tr_oh_labels, batch_size=128,epochs=20,validation_data = (val_images,val_oh_labels))
  • compile에서 optimizer,loss,metrics 설정
  • model.fit을 통해 적용

6. 모델 평가

model.evaluate(test_images, test_oh_labels, batch_size=256, verbose=1)
  • 마지막으로 test 데이터들로 모델을 평가해볼 수 있습니다.

이렇게 간략하게나마 Functional API를 경험해볼 수 있었습니다.
더 좋은 게시글로 다시 찾아올게요 !

0개의 댓글