Tensorflow Tutorial 1

 

초급자를 위한 빠른 시작

텐서플로우 임포트

import tensorflow as tf

MNIST 데이터 세트 불러오기

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(x_train[0:5])
[[[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  ...
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  ...
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  ...
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  ...
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  ...
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]]

성능 향상을 위해 0~255의 정수형 값이 들어있는 샘플 데이터를 255.0으로 나누어 0~1의 실수형으로 바꾸어준다.

x_train, x_test = x_train / 255.0, x_test / 255.0
print(x_train[0:5])
[[[0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  ...
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]]

 [[0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  ...
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]]

 [[0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  ...
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]]

 [[0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  ...
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]]

 [[0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  ...
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]
  [0. 0. 0. ... 0. 0. 0.]]]

모델 만들기

Sequential

  • Sequential 모델은 각 레이어에 정확히 하나의 입력 텐서와 하나의 출력 텐서가 있는 일반 레이어 스택에 적합
  • 레이어를 선형으로 연결하여 구성
  • 레이어 인스턴스를 생성자에게 넘겨줌으로써 Sequential 모델을 구성할 수 있다.
  • Sequential이 적합하지 않은 경우
    • 모델에 다중 입력 또는 다중 출력이 있는 경우
    • 레이어에 다중 입력 또는 다중 출력이 있는 경우
    • 레이어 공유를 해야 하는 경우
    • 비선형 토폴로지를 원하는 경우(예: 잔류 연결, 다중 분기 모델)

모델 구성

  • tf.keras.layers.Flatten: 28 * 28 형태의 2차원 배열을 1차원 배열로 평탄화 한다. Dense Layer(완전 결합층)과의 연결을 위해 필요
  • tf.keras.layers.Dense: 완전 결합층 실행. 출력 공간의 크기는 128이며, 활성화 함수는 relu 사용
  • tf.keras.layers.Dropout: 과적합 방지를 위해 일부 뉴런이 활성화 되지 않도록 함. 여기서는 20%의 뉴런을 동작시키지 않음
  • tf.keras.layers.Dense: 완전 결합층 실행. 최종 출력이기 때문에 출력 공간은 10, 활성화 함수는 softmax

compile

  • 모델을 학습시키기 이전에, compile 메소드를 통해서 학습 방식에 대한 환경설정
  • 다음의 세 개의 인자를 입력 받는다.
    • optimizer
    • 손실 함수
    • metric(평가 기준)
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
2022-01-24 14:03:49.637920: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:305] Could not identify NUMA node of platform GPU ID 0, defaulting to 0. Your kernel may not have been built with NUMA support.
2022-01-24 14:03:49.638767: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:271] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 0 MB memory) -> physical PluggableDevice (device: 0, name: METAL, pci bus id: <undefined>)


Metal device set to: Apple M1

모델을 훈련하고 평가

model.fit(x_train, y_train, epochs=5)

model.evaluate(x_test,  y_test, verbose=2)
2022-01-24 14:05:24.116699: W tensorflow/core/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz
2022-01-24 14:05:24.247724: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:112] Plugin optimizer for device_type GPU is enabled.


Epoch 1/5
1875/1875 [==============================] - 9s 4ms/step - loss: 0.2861 - accuracy: 0.9171
Epoch 2/5
1875/1875 [==============================] - 7s 4ms/step - loss: 0.1381 - accuracy: 0.9595
Epoch 3/5
1875/1875 [==============================] - 7s 4ms/step - loss: 0.1022 - accuracy: 0.9690
Epoch 4/5
1875/1875 [==============================] - 7s 4ms/step - loss: 0.0840 - accuracy: 0.9744
Epoch 5/5
1875/1875 [==============================] - 7s 4ms/step - loss: 0.0711 - accuracy: 0.9772


2022-01-24 14:05:59.910580: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:112] Plugin optimizer for device_type GPU is enabled.


313/313 - 1s - loss: 0.0784 - accuracy: 0.9762 - 910ms/epoch - 3ms/step





[0.07840103656053543, 0.9762000441551208]