이전 까지 예제에 사용했던 모델은 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()
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
반응형
'Data Analysis & ML > Deep Learning' 카테고리의 다른 글
[Deep Learning] 모델 저장하는 방법 (HDF5/tensorflow SaveModel/Callback) (0) | 2021.01.24 |
---|---|
[Deep Learning][딥러닝] CNN Image Augmentation(이미지 증식) (0) | 2021.01.24 |
[Deep Learning][딥러닝] CNN MNIST 분류 (0) | 2021.01.24 |
[Deep Learning][딥러닝] CNN_MNIST분류 / 모델저장/ FunctionalAPI (0) | 2020.11.09 |
[Deep Learning][딥러닝] CNN 개요 (0) | 2020.11.09 |