본문 바로가기

코딩

[TensorFlow] Vision Modeling(1) MNIST 태스크 모델링하기

🙋‍♀️ TensorFlow Conv2D와 MaxPooling2D layer을 익히고, 모델을 만들어 학습하기


1. TensorFlow Conv2D 

TensorFlow Conv2D> https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv2D

  • tf.keras.layers.Conv2D(
        filters, kernel_size, strides=(1, 1), padding='valid',
        data_format=None, dilation_rate=(1, 1), groups=1, activation=None, ... 
    )
    • filters : 아웃풋 차원 수
    • kernel_size : 2d ConV 윈도우의 height & width 설정
    • strides : stride에 대한 height & width 설정 / stride가 1이 아닐 경우 dilation_rate는 반드시 1로 설정
    • padding: valid no padding / same → 아웃풋 차원이 인풋 차원과 같도록 zero padding 수행
    • dilation_rate : dilated convolution에 사용할 dilation rate 지정 
  • Input Shape: 4+차원의 텐서 
    • data_format='channels_last' 일 경우, [배치사이즈, ( row 수, column 수, 채널수 )] 차원 (default)
    • data_format='channels_first' 일 경우, [배치사이즈, ( 채널수, row 수, column 수 )] 차원
  • Output Shape: 4+차원의 텐서
    • data_format='channels_last' 일 경우, [배치사이즈, ( 새로운 row 수, 새로운 column 수, filter 수 )] (default)
    • data_format='channels_first' 일 경우, [배치사이즈, ( filter 수, 새로운 row 수, 새로운 column 수 )] 

2. MNIST 태스크를 Convolution Neural Network를 활용하여 모델링하기

MNIST 태스크>>

2021.06.06 - [코딩] - [TensorFlow] 텐서플로우 2.0 기본 - Sequential & Functional API

 

[TensorFlow] 텐서플로우 2.0 기본 - Sequential & Functional API

참고 자료: https://www.tensorflow.org/tutorials/quickstart/beginner 0. Sequential vs Functional API Sequential API 레이어의 흐름이 순차적인 경우 사용 (layer-by-layer) 텐서가 이전 레이어에서 다음 레..

littlefoxdiary.tistory.com

 

2-1) 데이터 준비하기

- MNIST 데이터는 28x28 차원의 흑백 이미지

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

print(x_train.shape, x_test.shape)

- numpy의 expand_dims 함수를 사용해 channel 부분에 해당하는 차원을 만들어줌

import numpy as np

# 인풋 이미지를를 3차원 텐서로 바꾸기
x_train = np.expand_dims(x_train, -1)
x_test = np.expand_dims(x_test, -1)
print(x_train.shape, x_test.shape)

2-2) 모델 정의하고 컴파일하기

- TensorFlow Sequential API를 활용해 아래와 같은 모델을 만들 것

# Layer 쌓기
model = tf.keras.models.Sequential([         
  tf.keras.layers.Conv2D(32, kernel_size=(3,3), activation="relu", input_shape=(28,28,1)),
  tf.keras.layers.MaxPooling2D(pool_size=(2,2)),
  tf.keras.layers.Conv2D(64, kernel_size=(3,3), activation="relu"),
  tf.keras.layers.MaxPooling2D(pool_size=(2,2)),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dropout(0.5),
  tf.keras.layers.Dense(10, activation='softmax')
])

# 모델 컴파일하기
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.summary()

2-3) 모델 학습하기

# 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)