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

Python과 TensorFlow로 Illiad(일리아드) 데이터셋 훈련하는 방법

TensorFlow는 Google이 제공하는 대표적인 머신러닝 프레임워크입니다. 오픈소스로 공개되어 있으며, Python과 함께 사용하면 다양한 알고리즘과 딥러닝 애플리케이션을 손쉽게 구현할 수 있습니다. 연구 목적뿐 아니라 실제 서비스(프로덕션) 환경에서도 널리 활용되고 있습니다.

TensorFlow의 핵심 개념

TensorFlow는 복잡한 수학 연산을 빠르게 처리할 수 있는 최적화 기법을 내장하고 있습니다. 내부적으로 NumPy와 다차원 배열을 활용하기 때문인데, 이 다차원 배열을 바로 '텐서(tensor)'라고 부릅니다. 또한 딥 뉴럴 네트워크 구현을 기본적으로 지원합니다.

Windows 환경에서는 다음 명령어 한 줄로 tensorflow 패키지를 설치할 수 있습니다.

pip install tensorflow

텐서는 TensorFlow의 핵심 데이터 구조로, 데이터 흐름 다이어그램에서 노드 사이를 잇는 간선(edge) 역할을 합니다. 이 다이어그램을 '데이터 흐름 그래프(Data Flow Graph)'라고 하며, 텐서는 결국 다차원 배열 혹은 리스트라고 이해하면 됩니다.

Illiad 데이터셋 소개

이번 예제에서는 일리아드(Illiad) 데이터셋을 사용합니다. 이 데이터셋에는 William Cowper, Edward(더비 백작), Samuel Butler 세 번역가가 옮긴 일리아드 텍스트가 담겨 있으며, 모델은 한 줄의 텍스트가 주어졌을 때 이를 번역한 사람이 누구인지 분류하도록 훈련됩니다.

사용된 텍스트 파일은 사전에 전처리 과정을 거쳤습니다. 여기에는 문서의 헤더(header)와 푸터(footer) 제거, 행 번호 삭제, 챕터 제목 제거 등이 포함됩니다.

실행 환경: Google Colaboratory

예제 코드는 Google Colaboratory(Colab)에서 실행했습니다. Google Colab은 브라우저만으로 Python 코드를 실행할 수 있는 클라우드 환경을 제공하며, 별도의 설정 없이 GPU(그래픽 처리 장치)를 무료로 사용할 수 있다는 큰 장점이 있습니다. Colaboratory는 Jupyter Notebook을 기반으로 만들어졌습니다.

예제 코드

다음은 데이터셋을 구성하고 모델을 훈련·평가하는 코드입니다.

vocab_size += 2

print("Configure the dataset for better performance")
train_data = configure_dataset(train_data)
validation_data = configure_dataset(validation_data)

print("Train the model")
model = create_model(vocab_size=vocab_size, num_labels=3)
model.compile(
    optimizer='adam',
    loss=losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics=['accuracy'])
print("Fit the training data to the model")
history = model.fit(train_data, validation_data=validation_data, epochs=3)

print("Finding the accuracy and loss associated with training")
loss, accuracy = model.evaluate(validation_data)

print("The loss is : ", loss)
print("The accuracy is : {:2.2%}".format(accuracy))

코드 출처: https://www.tensorflow.org/tutorials/load_data/text

실행 결과

Configure the dataset for better performance
Train the model
Fit the training data to the model
Epoch 1/3
697/697 [==============================] - 35s 17ms/step - loss: 0.6891 - accuracy: 0.6736 -
val_loss: 0.3718 - val_accuracy: 0.8404
Epoch 2/3
697/697 [==============================] - 8s 11ms/step - loss: 0.3149 - accuracy: 0.8713 -
val_loss: 0.3621 - val_accuracy: 0.8422
Epoch 3/3
697/697 [==============================] - 8s 11ms/step - loss: 0.2165 - accuracy: 0.9162 -
val_loss: 0.4002 - val_accuracy: 0.8404
Finding the accuracy and loss associated with training
79/79 [==============================] - 1s 2ms/step - loss: 0.4002 - accuracy: 0.8404
The loss is : 0.40021833777427673
The accuracy is : 84.04%

코드 설명

  • 모델은 전처리와 벡터화가 완료된 데이터셋으로 훈련됩니다.

  • compile() 메소드로 모델을 컴파일한 뒤, fit() 메소드를 통해 총 3 에포크(epoch) 동안 학습을 진행합니다. 이 예제에서는 옵티마이저로 'adam'을, 손실 함수로는 3개 클래스 분류에 적합한 SparseCategoricalCrossentropy를 사용했습니다.

  • evaluate() 메소드를 호출해 검증 데이터에 대한 모델의 손실(loss)과 정확도(accuracy)를 평가합니다.

  • 평가 결과는 콘솔에 출력되며, 이 예제에서는 최종 정확도가 약 84.04%로 나타났습니다. 참고로 훈련 정확도는 에포크가 반복될수록 91.62%까지 상승한 반면 검증 정확도는 84% 수준에서 유지되었는데, 이는 에포크 2 이후 어느 정도 과적합(overfitting) 경향이 나타났음을 의미합니다.