텐서플로우란 구글이 제공하는 딥러닝 프레임워크(Framwork)이며 상위 API는 케라스(Keras)가 있다.
가장 기본적인 예제인 MNIST 손글씨 예제를 통해 사용법을 익혀볼 수 있다.
MNIST손글씨 예제는 위의 이미지들로 가장 기본적인 이미지 분류(image classification) 예제이다.
0부터 9까지의 아라비아 손글씨 이미지를 각 클래스로 분류하면서 데이터가 어떻게 생겼고 어떻게 분류되어야 하는지 이미지를 통해 알아볼 수 있다.
❓ MNIST 예제는 이진분류, 다중분류, 회귀 중 어디에 속할까?
문제를 풀기 전에 자신이 풀고자 하는 문제가 어디에 속하는지 파악하여 더 효율적이고 정확한 모델을 만들 수 있다.
MNIST 예제는 레이블의 클래스 수로 노드수를 맞추기 때문에 다중분류에 적합할 것이다.
!pip install tensorflow-gpu==2.0.0-rc1
import pandas as pd
import tensorflow as tf
⭐️ 이미지 데이터에서는 정규화하는 과정이 필요하다!⭐️
#라이브러리 데이터셋을 불러오기
mnist = tf.keras.datasets.mnist
# training set, test set으로 나눠주기
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# value normalization을 수행한다.
X_train, X_test = X_train/255.0, X_test/255.0
❓ 255로 나눠주는 이유: 정규화를 위하여, 8 비트 즉, 2^8인 256개의 값이 들어갈 수 있다. 0~255까지 256개의 값에서 가장 큰 것이 255이므로 정규화를 하기 위해 255로 나눠준다.
# 데이터의 레이블 구성 형태 살펴보기
# 처음보는 데이터의 경우 데이터 자체를 display해보면 도움이 된다.
pd.unique(y_train)
array([5, 0, 4, 1, 9, 2, 3, 6, 7, 8], dtype=uint8)
#신경망 모델 구축
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28,28)), ##쭉 늘려주는 역할을 한다.
tf.keras.layers.Dense(100, activation='relu'),
tf.keras.layers.Dropout(0.2), ##과적합(overfitting) 방지하는 역할을 함
tf.keras.layers.Dense(10, activation='softmax')
])
#구축한 모델을 컴파일하며, 옵티마이저, loss function 등을 설정해준다.
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
#모델 학습시키기
##epoch의 수를 변화시켜서 더 많이 학습시키거나 적게 학습시킬 수 있다.
model.fit(X_train, y_train, epochs=5)
#만들어진 모델을 사용해서 예측해보기
model.evaluate(X_test, y_test, verbose=2)
❓ flatten의 역할
❓ 마지막 dense 층의 숫자는 왜 10일까? : 10가지의 레이블로 분류해야하기 때문인 것 같다.
❓ 마지막 dense 층의 activation은 왜 softmax로 했을까?: 출력층의 노드 수를 레이블의 class와 동일하게 설정할 수 있도록 출력층을 다중분류로 설계하며 활성화 함수로 softmax를 사용한 것 같다.
❓ compile이 있는 부분에서 loss는 왜 저렇게 해준 것일까?