코딩
[TensorFlow] 텐서플로우 2.0 기본 - Sequential & Functional API
LittleFox
2021. 6. 6. 20:33
🙋♀️ TensorFlow Sequential API와 Functional API를 사용해 모델 구조를 만들고 학습하기
0. Sequential vs Functional API
Sequential API
- 레이어의 흐름이 순차적인 경우 사용 (layer-by-layer)
- 텐서가 이전 레이어에서 다음 레이어로 바로 이어질 때에 사용 가능
Functional API
- Sequential API보다 유연한 API로 다음의 기능을 사용할 수 있음
- 여러 개의 input을 받거나 여러 개의 output을 내야 하는 경우
- Layer을 공유하는 경우 (샴 네트워크 등....)
- Residual Network 구현
1. 태스크 이해하기 : MNIST 데이터 분류
- 손으로 쓴 0-9 사이의 숫자 이미지를 인풋으로 받아 숫자를 추론하는 태스크
- 60,000장의 학습 이미지와 10,000장의 테스트 이미지 존재
- 각각의 이미지는 28x28 사이즈의 흑백 (1-channel) 이미지
# MNIST 데이터셋 다운로드
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
2. 아키텍처 선택하기
모델
- 28x28 2차원의 이미지를 784x1차원 벡터로 변환
- Fully Connected Layer을 사용해 128차원 벡터로 정보 압축
- 최종적으로 0~9 중의 하나의 카테고리로 매핑하는 Fully Connected Layer 연결
Loss
- Sparse Categorical Cross-entropy Loss를 사용해 학습
Metric
- Accuracy 트래킹
Callback
- Early Stopping Callback 사용
3. Sequential API를 활용하여 모델 학습하기
3-1) 모델 레이어 쌓고 컴파일하기
- model.compile에서는 optimizer, loss, metric을 정의
# Layer 쌓기
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# 모델 컴파일하기
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.summary()
3-2) 모델 학습하기
- model.fit을 통해 실제 데이터를 사용해 모델을 학습
- 이때 callbacks를 통해 학습 사이클에서 수행할 작업을 정의할 수 있음
# EarlyStopping Callback 정의하기
callback = tf.keras.callbacks.EarlyStopping(
monitor='val_loss', min_delta=0, patience=1, verbose=0,
mode='auto', baseline=None, restore_best_weights=False
)
# Model.fit을 통해 학습하기
model.fit(
x=x_train, y=y_train, batch_size=32, epochs=50, verbose=1,
callbacks=callback, validation_split=0.2)
4. Functional API를 활용하여 모델 학습하기
4-1) 모델 레이어 쌓고 컴파일하기
# Input Layer 정의하기
inputs = tf.keras.Input(shape=(28,28,))
# Input ~ Output 연결하기
x = tf.keras.layers.Flatten(input_shape=(28, 28))(inputs)
x = tf.keras.layers.Dense(128, activation='relu')(x)
outputs= tf.keras.layers.Dense(10, activation='softmax')(x)
# tf.keras.Model을 사용해 인풋 ~ 아웃풋 연결하기
model = tf.keras.Model(inputs=inputs, outputs=outputs)
# 모델 컴파일하기
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.summary()
4-2) 모델 학습하기
# EarlyStopping Callback 정의하기
callback = tf.keras.callbacks.EarlyStopping(
monitor='val_loss', min_delta=0, patience=1, verbose=0,
mode='auto', baseline=None, restore_best_weights=False
)
# Model.fit을 통해 학습하기
model.fit(
x=x_train, y=y_train, batch_size=32, epochs=50, verbose=1,
callbacks=callback, validation_split=0.2)
참고 자료: https://www.tensorflow.org/tutorials/quickstart/beginner