Big Ben
Big Ben's Log
Big Ben
전체 방문자
오늘
어제
  • 전체 글 (80)
    • 파이썬 (23)
      • 파이썬 기초 (5)
      • 클래스 (6)
      • 자료구조 (4)
      • Tensorflow (3)
      • PyTorch (2)
      • konlpy (1)
      • anaconda (1)
    • 머신러닝 (3)
      • 선형회귀 (1)
      • Tree 기반 (1)
    • 딥러닝 (6)
      • NLP (2)
      • VISION (2)
      • TABULAR (0)
      • 딥러닝 서버 구축 (2)
    • 그래프 이론 (1)
      • 그래프마이닝 (1)
      • GNN (0)
    • 강화학습 (3)
      • 강화학습 기본 (3)
    • 인공지능 (5)
    • 추천시스템 (2)
      • 추천시스템 기초 (2)
    • Competitions (1)
    • 빅데이터 (8)
      • 하둡 (3)
      • 스파크 (4)
      • 클라우드 (1)
    • SQL (7)
      • MariaDB (2)
    • 논문 리뷰 (2)
    • 대학원 (0)
      • 데이터 사이언스 (0)
      • 경제학 (0)
    • 선형대수학 (7)
      • 선형대수 ICE BREAKING (1)
      • 벡터 (5)
      • 고윳값 (1)
    • 개인프로젝트 (0)
      • 포트폴리오 대시보드 + AI기반 주식 자동매매 (0)
    • 재테크 (1)
    • 자동차 (0)
    • 알고리즘 (11)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 하둡
  • 객체지향
  • 파이썬
  • AI
  • 딥러닝
  • 인공지능
  • PYTHON
  • 데이터
  • 프로그래밍
  • pytorch
  • 객체
  • 선형대수학
  • Baekjoon
  • 데이터베이스
  • MariaDB
  • 코테
  • 파이썬기초
  • 선형대수
  • 자료구조
  • 프로그래머스
  • 알고리즘
  • 데이터사이언스
  • TensorFlow
  • sql
  • class
  • 백준
  • 빅데이터
  • 코딩테스트
  • 머신러닝
  • mysql

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Big Ben

Big Ben's Log

[tensorflow] 함수형 API 활용한 CNN 예시
파이썬/Tensorflow

[tensorflow] 함수형 API 활용한 CNN 예시

2023. 2. 27. 22:29
반응형

Functional API 특징

텐서플로우에서 제공하는 가장 직관적인 Sequential 모델은 쉽고 빠르게 레이어를 쌓아 딥러닝 모델을 만들 수 있습니다.

 

여기서 Sequential 모델은 네트워크 입력과 출력이 하나라가 가정합니다. 그리고 많은 경우에서 이 가정이 적절합니다.

 

하지만 이런 가정이 맞지 않는 경우가 발생할 수 있습니다.

 

예를 들면 개별 입력을 여러 개 필요로 하는 네트워크이거나 여러 개를 출력하는 네트워크의 경우에는 단순히 선형적으로 층을 쌓는 sequential 모델로는 구현할 수 없습니다.

 

 

이런 경우 함수형 API를 고려합니다.

 

함수형 API는 다양한 경우에서 활용할 수 있습니다.

 

아래의 그림처럼 소셜 미디어 포스팅을 통해 나이를 예측하고, 수입을 예측하고, 성별을 예측하는 하나의 입력에 출력은 여러 개인 다중 출력 모델을 구성할 수도 있습니다

 

이미지 출처: https://nicola-ml.tistory.com/123

 

또는 입력을 여러 개 가져가는 다중입력 모델을 만들 수도 습니다.

 

예를 들면, '질문-응답' 모델을 생각해봅시다. 

하나의 입력은 질문에 대한 자연어이며, 또 다른 입력은 응답에 필요한 정보가 담겨 있는 텍스트 입니다.

이렇게 두 개의 다른 인풋이 들어갔을 때, 모델은 답을 출력합니다.

아래 모델은 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
    '파이썬/Tensorflow' 카테고리의 다른 글
    • [Tensorflow] Multi GPU 사용하기 (gpu 병렬처리)
    • [tensorflow] tensorflow-metal 설치 방법 (m1맥북 gpu)
    Big Ben
    Big Ben
    Data Scientist

    티스토리툴바