TensorFlow.org에서 보기 | 구글 코랩(Colab)에서 실행하기 | 깃허브(GitHub) 소스 보기 | Download notebook |
이 짧은 소개 글은 Keras를 사용하여 다음을 수행합니다.
- 사전에 빌드한 데이터세트를 로드합니다.
- 이미지를 분류하는 신경망 머신 러닝 모델을 빌드합니다.
- 이 신경망을 훈련합니다.
- 모델의 정확도를 평가합니다.
이 문서는 구글 코랩(Colaboratory) 노트북 파일입니다. 파이썬 프로그램을 브라우저에서 직접 실행할 수 있기 때문에 텐서플로를 배우고 사용하기 좋은 도구입니다:
- 파이썬 런타임(runtime)에 연결하세요: 메뉴 막대의 오른쪽 상단에서 CONNECT를 선택하세요.
- 노트북의 모든 코드 셀(cell)을 실행하세요: Runtime > Run all을 선택하세요.
TensorFlow 설정하기
시작하려면 TensorFlow를 프로그램으로 가져옵니다.
import tensorflow as tf
print("TensorFlow version:", tf.__version__)
2022-12-14 22:38:16.222182: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory 2022-12-14 22:38:16.222285: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory 2022-12-14 22:38:16.222296: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly. TensorFlow version: 2.11.0
MNIST 데이터셋을 로드하여 준비합니다. 샘플 값을 정수에서 부동소수로 변환합니다:
참고: 자체 개발 환경을 사용하는 경우에 TensorFlow 2 패키지를 설치하려면 최신 pip
로 업그레이드했는지 확인합니다. 자세한 내용은 설치 가이드를 참조합니다.
데이터세트 로드하기
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
머신 러닝 모델 빌드하기
층을 차례대로 쌓아 tf.keras.Sequential
모델을 만듭니다. 훈련에 사용할 옵티마이저(optimizer)와 손실 함수를 선택합니다:
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'])
각 예시에서 모델은 각 클래스에 대해 하나씩, logits 또는 log-odds 스코어 벡터를 반환합니다.
predictions = model(x_train[:1]).numpy()
predictions
array([[0.03628116, 0.1395217 , 0.15823159, 0.05388928, 0.10608026, 0.08605959, 0.08570158, 0.07082345, 0.13026407, 0.13314727]], dtype=float32)
tf.nn.softmax
함수는 다음과 같이 이러한 로짓을 각 클래스에 대한 확률로 변환합니다.
tf.nn.softmax(predictions).numpy()
array([[0.09375926, 0.10395633, 0.10591966, 0.09542481, 0.10053737, 0.09854456, 0.09850929, 0.0970545 , 0.10299838, 0.10329578]], dtype=float32)
참고: tf.nn.softmax
함수를 네트워크의 마지막 레이어에 대한 활성화 함수로 베이킹할 수 있습니다. 이렇게 하면 모델 출력을 더 직접적으로 해석할 수 있지만 이 접근법은 소프트맥스 출력을 사용할 경우 모든 모델에 대해 정확하고 수치적으로 안정적인 손실 계산을 제공하는 것이 불가능하므로 권장하지 않습니다.
losses.SparseCategoricalCrossentropy
를 사용하여 로짓의 벡터와 True
인덱스를 사용하고 각 예시에 대해 스칼라 손실을 반환하는 훈련용 손실 함수를 정의합니다.
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
이 손실은 실제 클래스의 음의 로그 확률과 같습니다. 모델이 올바른 클래스를 확신하는 경우 손실은 0입니다.
이 훈련되지 않은 모델은 무작위에 가까운 확률(각 클래스에 대해 1/10)을 제공하므로 초기 손실은 -tf.math.log(1/10) ~= 2.3
에 근접해야 합니다.
loss_fn(y_train[:1], predictions).numpy()
2.3172464
훈련을 시작하기 전에 Keras Model.compile
을 사용하여 모델을 구성하고 컴파일합니다. optimizer
클래스를 adam
으로 설정하고 loss
를 앞에서 정의한 loss_fn
함수로 설정합니다. metrics
매개변수를 accuracy
로 설정하여 모델에 대해 평가할 메트릭을 지정합니다.
model.compile(optimizer='adam',
loss=loss_fn,
metrics=['accuracy'])
모델 훈련 및 평가하기
모델을 훈련하고 평가합니다:
model.fit(x_train, y_train, epochs=5)
Epoch 1/5 /tmpfs/src/tf_docs_env/lib/python3.9/site-packages/keras/backend.py:5585: UserWarning: "`sparse_categorical_crossentropy` received `from_logits=True`, but the `output` argument was produced by a Softmax activation and thus does not represent logits. Was this intended? output, from_logits = _get_logits( 1875/1875 [==============================] - 5s 2ms/step - loss: 0.2982 - accuracy: 0.9143 Epoch 2/5 1875/1875 [==============================] - 4s 2ms/step - loss: 0.1447 - accuracy: 0.9571 Epoch 3/5 1875/1875 [==============================] - 4s 2ms/step - loss: 0.1056 - accuracy: 0.9675 Epoch 4/5 1875/1875 [==============================] - 4s 2ms/step - loss: 0.0873 - accuracy: 0.9727 Epoch 5/5 1875/1875 [==============================] - 4s 2ms/step - loss: 0.0734 - accuracy: 0.9776 <keras.callbacks.History at 0x7f32600bea60>
Model.evaluate
메서드는 일반적으로 "Validation-set" 또는 "Test-set"에서 모델 성능을 확인합니다.
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2)
Epoch 1/5 1875/1875 [==============================] - 4s 2ms/step - loss: 0.0665 - accuracy: 0.9787 Epoch 2/5 1875/1875 [==============================] - 4s 2ms/step - loss: 0.0566 - accuracy: 0.9814 Epoch 3/5 1875/1875 [==============================] - 4s 2ms/step - loss: 0.0532 - accuracy: 0.9831 Epoch 4/5 1875/1875 [==============================] - 4s 2ms/step - loss: 0.0483 - accuracy: 0.9840 Epoch 5/5 1875/1875 [==============================] - 4s 2ms/step - loss: 0.0443 - accuracy: 0.9847 313/313 - 1s - loss: 0.0652 - accuracy: 0.9802 - 639ms/epoch - 2ms/step [0.0652053952217102, 0.9801999926567078]
훈련된 이미지 분류기는 이 데이터셋에서 약 98%의 정확도를 달성합니다. 더 자세한 내용은 TensorFlow 튜토리얼을 참고하세요.
모델이 확률을 반환하도록 하려면 다음과 같이 훈련된 모델을 래핑하고 여기에 소프트맥스를 첨부할 수 있습니다.
probability_model = tf.keras.Sequential([
model,
tf.keras.layers.Softmax()
])
probability_model(x_test[:5])
<tf.Tensor: shape=(5, 10), dtype=float32, numpy= array([[0.08533785, 0.08533785, 0.08533785, 0.08534536, 0.08533785, 0.08533785, 0.08533785, 0.23195182, 0.08533785, 0.08533787], [0.08533675, 0.08533679, 0.23196921, 0.08533675, 0.08533675, 0.08533675, 0.08533675, 0.08533675, 0.08533675, 0.08533675], [0.08534124, 0.23189808, 0.08534473, 0.08534127, 0.08534144, 0.08534126, 0.08534157, 0.08536103, 0.08534817, 0.08534124], [0.231935 , 0.08533891, 0.08535128, 0.08533891, 0.08533892, 0.08533903, 0.08533918, 0.08533891, 0.08533891, 0.0853409 ], [0.08537032, 0.08537028, 0.08537029, 0.08537028, 0.23143794, 0.08537028, 0.08537028, 0.08537047, 0.08537029, 0.08559962]], dtype=float32)>
결론
축하합니다! Keras API를 사용하는 사전에 빌드한 데이터세트를 사용하여 머신 러닝 모델을 훈련했습니다.
Keras를 사용하는 더 많은 예시는 튜토리얼을 확인하세요. Keras로 모델을 빌드하는 방법에 대해 자세히 알아보려면 가이드를 읽어보세요. 데이터 로드 및 준비에 대해 자세히 알아보려면 이미지 데이터 로드 또는 CSV 데이터 로드에 대한 튜토리얼을 참조하세요.