Data Analysis & ML/Deep Learning

[Deep Learning][딥러닝] FunctionalAPI

YSY^ 2021. 1. 25. 13:24

 

이전 까지 예제에 사용했던 모델은 Sequential API를 사용한 것이었습니다.

Sequential API

def create_model():
    model = keras.Sequential()
    model.add(keras.layers.Dense(units=16, activation='relu', input_shape=(13,)))
    model.add(keras.layers.Dense(units=1))
    return model

위와 같은 Sequential API는 편리하고 직관적으로 알아볼 수 있지만, 단순하게 층을 쌓는것으로는 복잡한 인공신경망을 구현할 수 없습니다.

 

Functional API

더 복잡한 모델을 만들어 주기 위해 Functional API를 사용합니다. Functional API는 각 층을 일종의 함수(function)으로 정의합니다. 

1. Fully_conndeted FFNN(전결합 피드 포워드 신경망)

Function API는 입력데이터의 크기를 Input의 인자로 입력층을 정의해주어야 하고, 이전층을 다음층 함수의 입력으로 사용하고 변수에 할등하고, Model함수에 입출력을 정의합니다.

def create_model():
    X = Input(shape(10,))
    H = Dense(64, activation='relu')(X)
    H = Dense(64, activation='relu')(H)
    Y = Dense(1, activation = 'sigmoid')(H)
    model = Model(imputs=X, outputs = Y)
    return model

이를 모델로 저장한다면 Sequential API와 같이 compile와 fit를 사용가능합니다.

model = create_model()
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate), loss='mse')
model.summary()

 

2. CNN

예전에 했던 CNN MNIST분류 모델(ysyblog.tistory.com/151?category=1150980)도 Functional API로 구현해보겠습니다.

import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers as layers

def create_model_fn():
    # Input 레이어
    input = layers.Input(shape=(28,28,1))
    conv1 = layers.Conv2D(filters=32, kernel_size=3, padding='SAME', activation='relu')(input)
    pool1 = layers.MaxPool2D(padding='SAME')(conv1)

    conv2 = layers.Conv2D(filters=64, kernel_size=3, padding='SAME', activation='relu')(pool1)
    pool2 = layers.MaxPool2D(padding='SAME')(conv2)

    flatten = layers.Flatten()(pool2)
    dense1 = layers.Dense(256, activation='relu')(flatten)
    dropout1 = layers.Dropout(0.5)(dense1)
    output = layers.Dense(10, activation='softmax')(dropout1)

    #모델 생성
    model = keras.Model(inputs=input, outputs=output)

    return model
model = create_model_fn()
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()

Model이 function api로 되어있다.

3. 다중 입력을 받는 모델

- 다중입력과 다중출력을 가지는 모델입니다.

from tensorflow.keras.layers import Input, Dense, concatenate
from tensorflow.keras.models import Model
 
# 두 개의 입력층을 정의
A = Input(shape=(64,))
B = Input(shape=(128,))
 
# 첫번째 입력층으로부터 분기되어 진행되는 인공 신경망을 정의
X1 = Dense(16, activation="relu")(A)
H1 = Dense(8, activation="relu")(X1)
Y1 = Dense(8, activation="relu")(H1)

Model1= Model(inputs=X1, outputs=Y1)
 
# 두번째 입력층으로부터 분기되어 진행되는 인공 신경망을 정의
X2 = Dense(64, activation="relu")(B)
H2 = Dense(32, activation="relu")(X2)
H2 = Dense(16, activation="relu")(X2)
Y2 = Dense(8, activation="relu")(H2)
y = Model(inputs=X2, outputs=Y2)
 
# 두개의 인공 신경망의 출력을 연결(concatenate)
result = concatenate([Y1.output, Y2.output])
 
# 연결된 값을 입력으로 받는 밀집층을 추가(Dense layer)
z = Dense(2, activation="relu")(result)
# 선형 회귀를 위해 activation=linear를 설정
z = Dense(1, activation="linear")(z)
 
# 결과적으로 이 모델은 두 개의 입력층으로부터 분기되어 진행된 후 마지막에는 하나의 출력을 예측하는 모델이 됨.
model = Model(inputs=[X1.input, X2.input], outputs=z)

 

728x90
반응형