Functional API 특징
텐서플로우에서 제공하는 가장 직관적인 Sequential 모델은 쉽고 빠르게 레이어를 쌓아 딥러닝 모델을 만들 수 있습니다.
여기서 Sequential 모델은 네트워크 입력과 출력이 하나라가 가정합니다. 그리고 많은 경우에서 이 가정이 적절합니다.
하지만 이런 가정이 맞지 않는 경우가 발생할 수 있습니다.
예를 들면 개별 입력을 여러 개 필요로 하는 네트워크이거나 여러 개를 출력하는 네트워크의 경우에는 단순히 선형적으로 층을 쌓는 sequential 모델로는 구현할 수 없습니다.
이런 경우 함수형 API를 고려합니다.
함수형 API는 다양한 경우에서 활용할 수 있습니다.
아래의 그림처럼 소셜 미디어 포스팅을 통해 나이를 예측하고, 수입을 예측하고, 성별을 예측하는 하나의 입력에 출력은 여러 개인 다중 출력 모델을 구성할 수도 있습니다
또는 입력을 여러 개 가져가는 다중입력 모델을 만들 수도 습니다.
예를 들면, '질문-응답' 모델을 생각해봅시다.
하나의 입력은 질문에 대한 자연어이며, 또 다른 입력은 응답에 필요한 정보가 담겨 있는 텍스트 입니다.
이렇게 두 개의 다른 인풋이 들어갔을 때, 모델은 답을 출력합니다.
아래 모델은 3개의 인풋을 통해 하나의 출력을 나타내는 구조입니다.
물론 Sequential 모델이 제공하는 선형적인 모델도 구현할 수 있습니다.
코드 예제) imdb 텍스트 분류 - Functional API 구현
다음은 모델링을 해보겠습니다.
필요한 라이브러리를 불러줍시다.
# 텐서플로우 로딩
import tensorflow as tf
# 텐서플로우가 제공하는 imdb 데이터셋 로딩
from tensorflow.keras.datasets import imdb
# 자연어 길이를 맞춰주기 위해 padding
from tensorflow.keras.utils import pad_sequences
모델의 원리를 설명하기보다는 구현 방법에 집중하기 위해 불필요한 설명은 배제하고 넘어가겠습니다.
데이터를 불러주고, 사전에 정의해놓은 가장 빈번하게 등장하는 단어 2000개만 골라 사용하고, 문장별 길이는 최대 500자로 제한하겠습니다.
# 상위 빈도 단어 2000개 & 문서길이 500 단어로 제한
max_features = 2000
max_len = 500
# 데이터 호출
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=max_features)
# 500단어 미만인 문서에 한해서 패딩을 통해 길이 500으로 맞춰야함
X_train = pad_sequences(X_train, maxlen=max_len)
X_test = pad_sequences(X_test, maxlen=max_len)
print(X_train.shape) # (25000, )
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
print(X_train[0].shape) # (500, )
input 데이터가 준비되었습니다.
함수형 API를 호출하여 모델을 만들어보겠습니다. 모델의 모양은 아래와 같습니다.
다중 입력 또는 다중 출력 모델이 아닌, Sequential 모델을 functional API를 통해 구현해볼 것입니다.
코드는 아래와 같습니다.
input_layer = tf.keras.layers.Input(shape=(max_len, ))
embed = tf.keras.layers.Embedding(input_dim=max_features,
output_dim=128,
input_length=max_len,
name='embed')(input_layer)
x = tf.keras.layers.Conv1D(32, 7, activation='relu')(embed)
x = tf.keras.layers.MaxPooling1D(5)(x)
x = tf.keras.layers.Conv1D(32, 7, activation='relu')(x)
x = tf.keras.layers.GlobalMaxPooling1D()(x)
output = tf.keras.layers.Dense(1)(x)
다음은 모델에 입력과 출력을 기입해줘야 합니다. 할당한 뒤에는 컴파일까지 진행하겠습니다.
model = tf.keras.Model(inputs=[input_layer], outputs=[output])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
model.summary()
이제 학습시켜봅시다.
history = model.fit(X_train, y_train,
epochs=20,
batch_size=128,
validation_split=0.2)
제대로 학습되는 것을 볼 수 있습니다.
학습이 끝난 이후에 모델의 구조를 확인하고 싶다면 아래의 코드를 참고하시면 됩니다.
from tensorflow.keras.utils import plot_model
plot_model(model, show_shapes=True, to_file='./model.png')
'파이썬 > Tensorflow' 카테고리의 다른 글
[Tensorflow] Multi GPU 사용하기 (gpu 병렬처리) (1) | 2023.02.21 |
---|---|
[tensorflow] tensorflow-metal 설치 방법 (m1맥북 gpu) (1) | 2022.12.24 |