텐서플로 2.0 시작하기: 초보자용

TensorFlow.org에서 보기 구글 코랩(Colab)에서 실행하기 깃허브(GitHub) 소스 보기 Download notebook

이 짧은 소개 글은 Keras를 사용하여 다음을 수행합니다.

  1. 사전에 빌드한 데이터세트를 로드합니다.
  2. 이미지를 분류하는 신경망 머신 러닝 모델을 빌드합니다.
  3. 이 신경망을 훈련합니다.
  4. 모델의 정확도를 평가합니다.

이 문서는 구글 코랩(Colaboratory) 노트북 파일입니다. 파이썬 프로그램을 브라우저에서 직접 실행할 수 있기 때문에 텐서플로를 배우고 사용하기 좋은 도구입니다:

  1. 파이썬 런타임(runtime)에 연결하세요: 메뉴 막대의 오른쪽 상단에서 CONNECT를 선택하세요.
  2. 노트북의 모든 코드 셀(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 데이터 로드에 대한 튜토리얼을 참조하세요.