Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

사용자 지정 미니 배치 데이터저장소를 사용하여 메모리에 담을 수 없는 큰 텍스트 데이터 분류하기

이 예제에서는 사용자 지정 미니 배치 데이터저장소를 사용하여 딥러닝 신경망으로 메모리에 담을 수 없는 큰 텍스트 데이터를 분류하는 방법을 보여줍니다.

미니 배치 데이터저장소란 배치 단위로 데이터를 읽을 수 있는 데이터저장소를 구현한 것입니다. 미니 배치 데이터저장소는 딥러닝 응용 프로그램을 위한 훈련, 검증, 테스트 및 예측 데이터 세트의 소스로 사용할 수 있습니다. 미니 배치 데이터저장소를 사용하여 메모리에 다 담을 수 없을 정도로 큰 데이터를 읽어 들이거나, 데이터를 배치 단위로 읽을 때 특정 전처리 연산을 수행할 수 있습니다.

신경망을 훈련시킬 때 입력 데이터를 채우거나 자르거나 분할하여 동일한 길이의 시퀀스로 구성된 미니 배치를 만듭니다. trainingOptions 함수는 입력 시퀀스를 채우고 자르는 옵션을 제공합니다. 그러나 이러한 옵션은 단어 벡터로 구성된 시퀀스에 적합하지 않습니다. 뿐만 아니라 이 함수는 사용자 지정 데이터저장소의 데이터를 채우는 것을 지원하지 않습니다. 따라서 시퀀스를 수동으로 채우고 잘라야 합니다. 단어 벡터로 구성된 시퀀스를 왼쪽을 채우고 자르면 훈련이 향상될 수 있습니다.

딥러닝을 사용하여 텍스트 데이터 분류하기 예제에서는 모든 문서가 동일한 길이가 되도록 수동으로 자르고 채우는 방법을 설명합니다. 이 과정은 매우 짧은 문서에 다량의 채우기를 추가하고 매우 긴 문서에서 다량의 데이터를 버립니다.

또는 다량의 채우기를 추가하거나 다량의 데이터가 버려지지 않도록 하려면 신경망에 미니 배치를 입력하는 사용자 지정 미니 배치 데이터저장소를 만드십시오. 사용자 지정 미니 배치 데이터저장소 textDatastore.m은 문서의 미니 배치를 시퀀스 또는 단어 인덱스로 변환하고 각 미니 배치의 왼쪽을 채워서 미니 배치에서 가장 긴 문서와 길이가 같아지도록 합니다. 정렬된 데이터의 경우 문서가 고정된 길이로 채워지지 않으므로 이 데이터저장소는 데이터에 추가되는 채우기의 양을 줄이는 데 도움이 될 수 있습니다. 마찬가지로, 이 데이터저장소는 문서에서 데이터를 버리지 않습니다.

이 예제에서는 사용자 지정 미니 배치 데이터저장소 textDatastore.m을 사용합니다. 함수를 사용자 지정하여 이 데이터저장소를 데이터에 맞게 수정할 수 있습니다. 고유한 사용자 지정 미니 배치 데이터저장소를 만드는 예제는 Develop Custom Mini-Batch Datastore (Deep Learning Toolbox) 항목을 참조하십시오.

사전 훈련된 단어 임베딩 불러오기

데이터저장소 textDatastore가 문서를 벡터 시퀀스로 변환하려면 단어 임베딩이 필요합니다. 사전 훈련된 단어 임베딩을 fastTextWordEmbedding을 사용하여 불러옵니다. 이 함수를 사용하려면 Text Analytics Toolbox™ Model for fastText English 16 Billion Token Word Embedding 지원 패키지가 필요합니다. 이 지원 패키지가 설치되어 있지 않으면 함수에서 다운로드 링크를 제공합니다.

emb = fastTextWordEmbedding;

문서의 미니 배치 데이터저장소 만들기

훈련용 데이터를 포함하는 데이터저장소를 만듭니다. 미니 배치 데이터저장소 textDatastore는 CSV 파일에서 예측 변수와 레이블을 읽어 들입니다. 데이터저장소는 예측 변수에 대해 문서를 단어 인덱스로 구성된 시퀀스로 변환하고, 응답 변수에 대해 각 문서에 대한 categorical형 레이블을 반환합니다.

데이터저장소를 만들려면 먼저 사용자 지정 미니 배치 데이터저장소 textDatastore.m을 경로에 저장하십시오. 사용자 지정 미니 배치 데이터저장소 만들기에 대한 자세한 내용은 Develop Custom Mini-Batch Datastore (Deep Learning Toolbox) 항목을 참조하십시오.

훈련 데이터에 대해 CSV 파일 "factoryReports.csv"를 지정하고 텍스트와 레이블이 각각 "Description" 열과 "Category" 열에 있다고 지정합니다.

filenameTrain = "factoryReports.csv";
textName = "Description";
labelName = "Category";
dsTrain = textDatastore(filenameTrain,textName,labelName,emb)
dsTrain = 
  textDatastore with properties:

            ClassNames: ["Electronic Failure"    "Leak"    "Mechanical Failure"    "Software Failure"]
             Datastore: [1×1 matlab.io.datastore.TransformedDatastore]
    EmbeddingDimension: 300
             LabelName: "Category"
         MiniBatchSize: 128
            NumClasses: 4
       NumObservations: 480

LSTM 신경망 만들고 훈련시키기

LSTM 신경망 아키텍처를 정의합니다. 신경망에 시퀀스 데이터를 입력하려면 시퀀스 입력 계층을 포함시키고 입력 크기를 임베딩 차원으로 설정하십시오. 다음으로, 은닉 유닛 180개를 갖는 LSTM 계층을 포함시킵니다. sequence-to-label 분류 문제에서 LSTM 계층을 사용하려면 출력 모드를 'last'로 설정하십시오. 마지막으로, 출력 크기가 클래스 개수와 같은 완전 연결 계층, 소프트맥스 계층, 분류 계층을 추가합니다.

numFeatures = dsTrain.EmbeddingDimension;
numHiddenUnits = 180;
numClasses = dsTrain.NumClasses;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

훈련 옵션을 지정합니다. 솔버를 'adam' 으로 지정하고 기울기 임계값을 2로 지정합니다. 데이터저장소 textDatastore.m은 섞기를 지원하지 않으므로 'Shuffle''never'로 설정합니다. 섞기가 지원되는 데이터저장소를 구현하는 방법에 대한 예제는 Develop Custom Mini-Batch Datastore (Deep Learning Toolbox) 항목을 참조하십시오. 훈련 진행 상황을 모니터링하려면 'Plots' 옵션을 'training-progress'로 설정하십시오. 세부 정보가 출력되지 않도록 하려면 'Verbose'false로 설정하십시오.

기본적으로 trainNetwork는 GPU를 사용할 수 있으면 GPU를 사용합니다. 실행 환경을 수동으로 지정하려면 trainingOptions'ExecutionEnvironment' 이름-값 쌍 인수를 사용하십시오. CPU에서 훈련시키면 GPU에서 훈련시키는 것보다 시간이 상당히 오래 걸릴 수 있습니다. GPU를 사용하여 훈련시키려면 Parallel Computing Toolbox™와 지원되는 GPU 장치가 필요합니다. 지원되는 장치에 대한 자세한 내용은 항목을 참조하십시오.

miniBatchSize = 128;
numObservations = dsTrain.NumObservations;
numIterationsPerEpoch = floor(numObservations / miniBatchSize);

options = trainingOptions('adam', ...
    'MiniBatchSize',miniBatchSize, ...
    'GradientThreshold',2, ...
    'Shuffle','never', ...
    'Plots','training-progress', ...
    'Verbose',false);

trainNetwork 함수를 사용하여 LSTM 신경망을 훈련시킵니다.

net = trainNetwork(dsTrain,layers,options);

새 데이터를 사용하여 예측하기

새 보고서 3개의 이벤트 유형을 분류합니다. 새 보고서를 포함하는 string형 배열을 만듭니다.

reportsNew = [ 
    "Coolant is pooling underneath sorter."
    "Sorter blows fuses at start up."
    "There are some very loud rattling sounds coming from the assembler."];

데이터저장소 textDatastore.m처럼 전처리 단계를 사용하여 텍스트 데이터를 전처리합니다.

documents = tokenizedDocument(reportsNew);
documents = lower(documents);
documents = erasePunctuation(documents);
predictors = doc2sequence(emb,documents);

훈련된 LSTM 신경망을 사용하여 새 시퀀스를 분류합니다.

labelsNew = classify(net,predictors)
labelsNew = 3×1 categorical
     Leak 
     Electronic Failure 
     Mechanical Failure 

참고 항목

| | | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | | | |

관련 항목