우선, 저는 이때까지 Sequential을 이용하여 모델을 만들어 본 적밖에 없어서, Functional API를 이용하여 만드는 것이 굉장히 생소하였습니다.
그러나, Functional API를 사용하니 훨씬 눈에 잘 들어오고, 세부적으로 설정할 수 있어서 더 좋은 것 같습니다!
이번 게시물에서는 Functional API
실습한 것을 적어보도록 하겠습니다.
data는 fashion_mnist
를 활용하겠습니다!
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
model = create_model()
model.summary()
아주 정확하게 들어온 것이 보이죠??
여기에서 param
이 784개의 입력값을 받아 100개의 node를 지나면 78400개 아닌가? 라는 의문이 드실 수 있는데요!
node 하나 당 1개의 bias값
을 가지고 있어서 78500개인 것입니다!
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)
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)
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))
optimizer
,loss
,metrics
설정model.evaluate(test_images, test_oh_labels, batch_size=256, verbose=1)
이렇게 간략하게나마 Functional API를 경험해볼 수 있었습니다.
더 좋은 게시글로 다시 찾아올게요 !