들어가며

지난 시간까지 케라스의 Sequential API를 이용해서 간단한 선형 신경망을 만들어 회귀와 분류를 진행했습니다.

만약 여러개의 입력, 출력층을 만들고 싶거나 좀 더 복잡한 신경망을 만들고 싶다면 어떻게 해야할까요? 이번에는 함수형 API를 사용해서 이 문제를 해결해보겠습니다.

 

목차

1. 함수형 API란?

2. Wide & Deep 신경망

3. 여러개의 입력,출력층

 

1. 함수형 API란?

함수형 API는 말 그대로 코드에서 함수처럼 신경망 층을 다루는 API입니다. 

input_B = keras.layers.Input(shape=[6], name="deep_input")
hidden1 = keras.layers.Dense(30, activation="relu")(input_B)

두 번째 줄을 보면 새로운 Dense층을 선언하면서 뒤에 인자로 기존에 선언한 input_B를 입력하는 것을 볼 수 있습니다.

이렇게 되면 hidden1층은 input_B를 자신의 입력층으로 정한다는 뜻입니다. 생각보다 매우 간단합니다.

 

2. Wide & Deep 신경망

이를 이용해서 새로운 신경망 구조를 만들어 보겠습니다.

Wide & Deep 신경망은 2016년 헝쯔 청의 논문에서 소개되었습니다. 이 그림은 입력층의 일부 또는 전체가 곧바로 출력층에 연결되는 경우가 있습니다. 이 경우 간단한 규칙과 복잡한 규칙을 모두 학습할 수 있습니다.

출처 : https://bcho.tistory.com/1187

함수형 API를 이용해서 코드를 작성해봅시다.

from tensorflow import keras

input_ = keras.layers.Input(shape=X_train.shape[1:])
hidden1 = keras.layers.Dense(30, activation="relu")(input_)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.concatenate([input_, hidden2])
output = keras.layers.Dense(1)(concat)
model = keras.models.Model(inputs=[input_], outputs=[output])

각 층들이 필요한 입력층은 인자로 선언함으로서 간단하게 구현하는 모습입니다. concatenate층은 두개의 층을 하나로 합치는 층을 의미합니다. 이를 통해서 Wide & Deep모델을 만들 수 있습니다.

summary() 메서드를 통해서 정보를 보면 각층은 인자에 맞게 잘 연결된 모습을 볼 수 있습니다.

colab.research.google.com/drive/1bdwyrHcNh9LXi9jqU_zmDtnoBL6zy2EL?usp=sharing

 

Google Colaboratory

 

colab.research.google.com

3. 여러개의 입력, 출력층

여러개의 출력층을 사용하는 경우는 매우 다양합니다.

예를 들어 사람의 얼굴에서 여러가지 감정의 추정값을 만들거나 이미지 인식에서 물체의 폭, 너비 등의 데이터를 추출할 때입니다. 그렇다면 여러개의 출력층은 어떻게 만들까요? 

결론적으로 keras.models.Model을 선언할 때 출력층은 여러개로 만들면됩니다.

 

코드로 작성해봅시다.

input_A = keras.layers.Input(shape=[5], name="wide_input")
input_B = keras.layers.Input(shape=[6], name="deep_input")
hidden1 = keras.layers.Dense(30, activation="relu")(input_B)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.concatenate([input_A, hidden2])
output = keras.layers.Dense(1, name="main_output")(concat)
aux_output = keras.layers.Dense(1, name="aux_output")(hidden2)
model = keras.models.Model(inputs=[input_A, input_B],
                           outputs=[output, aux_output])

위 코드를 보면 마지막 Model에서 outputs으로 두개의 층을 선언하는 모습을 볼 수 있습니다. aux_output은 층의 중간에서 데이터가 잘 학습되고 있는지 관찰하기 위한 보조출력입니다.

 

마치며

이렇게 함수형  API를 이용해서 복잡한 모델을 간단하게 만들어보았습니다. 하지만 모델 내부에 조건문을 선언하거나 반복문을 선언하는 등 세부적인 프로그래밍은 불가능합니다. 다음에는 이를 해결하기 위한 서브클래싱  API를 만들어 보겠습니다.

+ Recent posts