딥러닝 - Tensorflow: Sequential API, Functional API, Subclassing API

dumbbelldore·2025년 1월 11일
0

zero-base 33기

목록 보기
67/97

1. Tensorflow 모델링 방식

  • Tensorflow 기반 모델링을 수행할 때 다음과 같은 API를 사용할 수 있음

    • Sequential API: 단순하면서 직선적인 모델을 설계할 때 유용

    • Functional API: 복잡한 네트워크 구조를 가진 모델을 설계할 때 유용

    • Subclassing API: 객체지향적 형태로 모델을 설계하고자 할 때 유용

  • 각 API는 장단점을 보유하고 있어, 용도에 맞게 활용이 필요함


2. Sequential API

  • 레이어를 순차적(sequential)으로 쌓아올리는 방식으로, 단순한 피드포워드 신경망 설계에 적합
  • 각 레이어는 이전 레이어의 출력과 연결되므로, 단일 입력과 단일 출력만 허용됨
  • Sequential() 클래스 내 필요한 레이어를 적재하는 방식으로 사용
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Flatten

# Sequential() 클래스 내 레이어을 순차적으로 적재
model = Sequential([
    Flatten(input_shape=(28, 28)),  # 입력 레이어
    Dense(128, activation='relu'),  # 은닉층
    Dense(10, activation='softmax') # 출력층
])

3. Functional API

  • 레이어의 연결을 자유롭게 설정하고, 복잡한 구조의 구현이 가능함
  • 다중 입력과 다중 출력도 가능하고, 분기/병합을 수행할 수 있어 유연한 모델링이 가능함
  • 각 레이어의 끝에 '괄호()'를 활용하여 레이어를 명시적으로 연결하며 Model() 클래스에 시작점과 종료점을 넣어줘야 함
from tensorflow.keras import Model
from tensorflow.keras.layers import Input, Dense, Flatten

inputs = Input(shape=(28, 28))
flat = Flatten()(inputs) # inputs 레이어를 flat 레이어에 연결
dense = Dense(128, activation='relu')(flat)  # flat 레이어를 dense 레이어에 연결
outputs = Dense(10, activation='softmax')(dense) # dense 레이어를 outputs 레이어에 연결

# 시작점/종료점 명시하여 모델 생성
model = Model(inputs=inputs, outputs=outputs)

4. Subclassing API

  • Functional API와 마찬가지로 복잡한 구조를 설계하고자 할 때 유용함
  • 객체지향적 형태를 띄기 때문에 동일한 모델을 계속 찍어내야 할 때 간결한 코드를 구현할 수 있음
  • tf.keras.Layer 또는 tf.keras.Model 클래스를 상속받아 Subclassing 방식으로 모델을 제작할 수 있음
import tensorflow as tf

# 커스텀 클래스 정의
class MyModel(tf.keras.Model): # Model 클래스 상속
    def __init__(self):
        super(MyModel, self).__init__()
        # 사용할 레이어 정의
        self.conv1 = tf.keras.layers.Conv2D(32, 3, activation='relu')
        self.flatten = tf.keras.layers.Flatten()
        self.dense1 = tf.keras.layers.Dense(128, activation='relu')
        self.dense2 = tf.keras.layers.Dense(10)
	
    # 레이어 연결
    def call(self, inputs):
        x = self.conv1(inputs)
        x = self.flatten(x)
        x = self.dense1(x)
        return self.dense2(x)
        
# 모델 생성
model1 = MyModel()
model2 = MyModel() # 동일한 모델을 손쉽게 여러개 찍어낼 수 있음

# 모델 컴파일
model1.compile(optimizer='adam', 
			   loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
               metrics=['accuracy'])

# 모델 훈련
model1.fit(train_images, train_labels, epochs=10)

5. API 혼합 사용

  • Functional API와 Sequential API는 호환 가능하므로, 필요에 따라 혼합하여 사용할 수도 있음
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Input

# Functional API로 입력 생성
inputs = Input(shape=(32,))
x = Dense(64, activation='relu')(inputs)

# Sequential API로 레이어 생성
seq_model = Sequential([
    Dense(64, activation='relu'),
    Dense(32, activation='relu')
])

# Functional API와 Sequential API 간 연결
x = seq_model(x)
outputs = Dense(10, activation='softmax')(x)

# 모델 생성
model = Model(inputs=inputs, outputs=outputs)

*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.

profile
데이터 분석, 데이터 사이언스 학습 저장소

0개의 댓글