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

TensorFlow와 Python으로 전처리된 데이터를 섞는 방법

TensorFlow는 구글(Google)에서 제공하는 머신러닝 프레임워크입니다. 오픈소스 기반으로 Python과 함께 사용되어 알고리즘, 딥러닝 애플리케이션 등을 구현할 수 있으며, 연구 목적과 상용 환경 모두에서 활용됩니다. 복잡한 수학 연산을 빠르게 처리할 수 있는 최적화 기법을 갖추고 있는데, 이는 내부적으로 NumPy와 다차원 배열을 사용하기 때문입니다. 이러한 다차원 배열은 '텐서(tensor)'라고 불리며, 프레임워크는 심층 신경망(Deep Neural Network) 작업도 지원합니다.

TensorFlow 설치하기

'tensorflow' 패키지는 Windows 환경에서 아래 코드 한 줄로 설치할 수 있습니다.

pip install tensorflow

텐서(Tensor)는 TensorFlow에서 사용되는 데이터 구조로, 흐름 다이어그램의 엣지(edge)를 연결하는 역할을 합니다. 이 흐름 다이어그램은 '데이터 플로우 그래프(Data flow graph)'라고 알려져 있으며, 텐서는 결국 다차원 배열 또는 리스트에 해당합니다.

사용할 데이터셋 소개

이번 예제에서는 일리아드(Illiad) 데이터셋을 사용합니다. 이 데이터셋에는 William Cowper, Edward(더비 백작), Samuel Butler 세 사람의 번역 작품 텍스트가 담겨 있으며, 모델은 한 줄의 텍스트가 주어졌을 때 어떤 번역자의 문장인지 식별하도록 훈련됩니다. 사용된 텍스트 파일은 사전에 전처리 과정을 거쳤습니다. 여기에는 문서 헤더와 푸터 제거, 줄 번호 및 챕터 제목 삭제 등이 포함됩니다.

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

예제 코드

다음은 라벨링된 데이터셋을 합치고 섞는(shuffle) 코드입니다.

print("Combine the labelled dataset and reshuffle it")
BUFFER_SIZE = 50000
BATCH_SIZE = 64
VALIDATION_SIZE = 5000
all_labeled_data = labeled_data_sets[0]
for labeled_dataset in labeled_data_sets[1:]:
    all_labeled_data = all_labeled_data.concatenate(labeled_dataset)
all_labeled_data = all_labeled_data.shuffle(
    BUFFER_SIZE, reshuffle_each_iteration=False)
print("Displaying a few samples of input data")
for text, label in all_labeled_data.take(8):
    print("The sentence is : ", text.numpy())
    print("The label is :", label.numpy())

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

실행 결과

Combine the labelled dataset and reshuffle it
Displaying a few samples of input data
The sentence is : b'But I have now both tasted food, and given'
The label is : 0
The sentence is : b'All these shall now be thine: but if the Gods'
The label is : 1
The sentence is : b'Their spiry summits waved. There, unperceived'
The label is : 0
The sentence is : b'"I pray you, would you show your love, dear friends,'
The label is : 1
The sentence is : b'Entering beneath the clavicle the point'
The label is : 0
The sentence is : b'But grief, his father lost, awaits him now,'
The label is : 1
The sentence is : b'in the fore-arm where the sinews of the elbow are united, whereon he'
The label is : 2
The sentence is : b'For, as I think, I have already chased'
The label is : 0

코드 설명

  • 데이터 전처리가 완료되면, 데이터셋의 일부 샘플들이 콘솔에 출력됩니다.

  • 출력 결과를 보면 데이터가 특정 순서 없이 뒤섞여 있으며, 'all_labeled_data'의 각 항목은 하나의 데이터 포인트에 대응됩니다.

핵심 동작 과정을 정리하면 다음과 같습니다. 먼저 concatenate() 메서드를 사용해 세 개의 라벨링된 데이터셋을 하나로 합친 뒤, shuffle() 메서드에 버퍼 크기(BUFFER_SIZE)를 지정하여 데이터를 섞습니다. 이때 reshuffle_each_iteration=False로 설정하면 매 에포크(epoch)마다 셔플 순서가 유지되어 재현성 있는 학습이 가능합니다. 마지막으로 take(8)을 통해 섞인 데이터 중 8개 샘플을 추출해 문장과 라벨이 올바르게 매칭되었는지 확인합니다. 이처럼 데이터를 충분히 섞는 것은 모델이 특정 번역자의 문체 순서에 편향되지 않도록 하는 데 중요한 단계입니다.