Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

TensorFlow의 fit 메서드로 모델에 데이터를 학습시키는 방법

TensorFlow에서는 fit 메서드를 사용하여 데이터를 모델에 맞추고(학습시키고) 할 수 있습니다.

관련 글: TensorFlow란 무엇이며, Keras는 어떻게 TensorFlow와 함께 작동하여 신경망을 만들까요?

전이 학습(Transfer Learning)과 합성곱 신경망

최소 하나 이상의 합성곱 계층(convolutional layer)을 포함하는 신경망을 합성곱 신경망(CNN, Convolutional Neural Network)이라고 하며, 이를 활용해 학습 모델을 구축할 수 있습니다.

이미지 분류에서 전이 학습의 기본 아이디어는 다음과 같습니다. 대규모의 일반적인 데이터셋으로 학습된 모델은 시각적 세계 전반에 적용할 수 있는 범용 모델 역할을 효과적으로 수행할 수 있다는 것입니다. 이러한 모델은 이미 특징 맵(feature map)을 학습한 상태이므로, 사용자가 대규모 데이터셋으로 처음부터 거대한 모델을 학습시킬 필요가 없습니다.

TensorFlow Hub 활용하기

TensorFlow Hub는 사전 학습된(pre-trained) TensorFlow 모델들을 모아놓은 저장소입니다. TensorFlow를 사용하면 이러한 학습 모델을 세밀하게 조정(fine-tuning)할 수 있습니다.

이번 예제에서는 TensorFlow Hub의 모델을 tf.keras와 함께 사용하는 방법을 알아보겠습니다. 먼저 TensorFlow Hub에서 제공하는 이미지 분류 모델을 가져온 뒤, 사전 학습된 분류기 모델에 이미지를 입력하여 어떤 이미지인지 예측합니다. 이 과정은 별도의 학습 없이도 수행할 수 있습니다. 이후에는 전이 학습을 통해 사용자가 원하는 커스텀 이미지 클래스에 맞게 모델을 미세 조정할 수 있습니다.

실행 환경: Google Colaboratory

아래 코드는 Google Colaboratory에서 실행했습니다. Google Colab은 브라우저에서 바로 Python 코드를 실행할 수 있게 해주며, 별도의 설정이 필요 없고 GPU(그래픽 처리 장치)도 무료로 사용할 수 있습니다. Colaboratory는 Jupyter Notebook을 기반으로 구축되었습니다.

예제 코드

print("Training for 2 epochs only")
class CollectBatchStats(tf.keras.callbacks.Callback):
    def __init__(self):
        self.batch_losses = []
        self.batch_acc = []
    def on_train_batch_end(self, batch, logs=None):
        self.batch_losses.append(logs['loss'])
        self.batch_acc.append(logs['acc'])
        self.model.reset_metrics()
batch_stats_callback = CollectBatchStats()
print("The fit method is called")
history = model.fit(train_ds, epochs=2,
callbacks=[batch_stats_callback])

코드 출처 — https://www.tensorflow.org/tutorials/images/transfer_learning_with_hub

실행 결과

Training for 2 epochs only
The fit method is called
Epoch 1/2
92/92 [==============================] - 88s 919ms/step - loss: 0.7155 - acc: 0.7460
Epoch 2/2
92/92 [==============================] - 85s 922ms/step - loss: 0.3694 - acc: 0.8754

코드 설명

  • .fit 메서드는 모델을 학습시키는 데 사용됩니다. 학습 데이터(train_ds)와 에포크 수를 인자로 전달하면 TensorFlow가 자동으로 학습 루프를 처리합니다.
  • 학습 시간을 줄이기 위해 2개의 에포크(epoch)만 사용하여 짧게 진행했습니다.
  • 커스텀 콜백(CollectBatchStats)을 정의하여 각 배치(batch)별 손실(loss)과 정확도(acc)를 개별적으로 기록함으로써, 학습 과정을 더 세밀하게 시각화하고 모니터링할 수 있습니다.

실행 결과를 보면 첫 번째 에포크에서 정확도가 약 74.6%, 두 번째 에포크에서 약 87.5%로 상승했으며, 손실 역시 0.7155에서 0.3694로 감소한 것을 확인할 수 있습니다. 이는 사전 학습된 모델을 활용한 전이 학습이 적은 학습량으로도 좋은 성능을 낼 수 있음을 보여줍니다.