텐서플로우 임포트
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]