컨벌루션 신경망을 사용하여 텍스트 데이터 분류하기
이 예제에서는 컨벌루션 신경망을 사용하여 텍스트 데이터를 분류하는 방법을 보여줍니다.
컨벌루션을 사용하여 텍스트 데이터를 분류하려면 입력의 시간 차원에 대해 컨벌루션하는 1-D 컨벌루션 계층을 사용합니다.
이 예제에서는 다양한 너비의 1-D 컨벌루션 필터로 신경망을 훈련시킵니다. 각 필터의 너비는 필터가 볼 수 있는 단어 수(n-gram 길이)에 대응됩니다. 신경망에는 컨벌루션 계층의 여러 분기가 있으므로 다양한 n-gram 길이를 사용할 수 있습니다.
데이터 불러오기
factoryReports.csv
의 데이터에서 테이블 형식 텍스트 데이터저장소를 만들고 처음 몇 개의 보고서를 표시합니다.
data = readtable("factoryReports.csv");
head(data)
Description Category Urgency Resolution Cost _______________________________________________________________________ ______________________ __________ ______________________ _____ {'Items are occasionally getting stuck in the scanner spools.' } {'Mechanical Failure'} {'Medium'} {'Readjust Machine' } 45 {'Loud rattling and banging sounds are coming from assembler pistons.'} {'Mechanical Failure'} {'Medium'} {'Readjust Machine' } 35 {'There are cuts to the power when starting the plant.' } {'Electronic Failure'} {'High' } {'Full Replacement' } 16200 {'Fried capacitors in the assembler.' } {'Electronic Failure'} {'High' } {'Replace Components'} 352 {'Mixer tripped the fuses.' } {'Electronic Failure'} {'Low' } {'Add to Watch List' } 55 {'Burst pipe in the constructing agent is spraying coolant.' } {'Leak' } {'High' } {'Replace Components'} 371 {'A fuse is blown in the mixer.' } {'Electronic Failure'} {'Low' } {'Replace Components'} 441 {'Things continue to tumble off of the belt.' } {'Mechanical Failure'} {'Low' } {'Readjust Machine' } 38
데이터를 훈련 파티션과 검증 파티션으로 분할합니다. 데이터의 80%는 훈련에 사용하고 나머지 데이터는 검증에 사용합니다.
cvp = cvpartition(data.Category,Holdout=0.2); dataTrain = data(training(cvp),:); dataValidation = data(test(cvp),:);
텍스트 데이터 전처리하기
테이블의 "Description"
열에서 텍스트 데이터를 추출하고 preprocessText
함수(예제의 텍스트 함수 전처리하기 섹션에 있음)를 사용하여 전처리합니다.
documentsTrain = preprocessText(dataTrain.Description);
"Category"
열에서 레이블을 추출하여 categorical형으로 변환합니다.
TTrain = categorical(dataTrain.Category);
클래스 이름과 관측값 개수를 표시합니다.
classNames = unique(TTrain)
classNames = 4×1 categorical
Electronic Failure
Leak
Mechanical Failure
Software Failure
numObservations = numel(TTrain)
numObservations = 384
동일한 단계를 사용하여 검증 데이터를 추출하고 전처리합니다.
documentsValidation = preprocessText(dataValidation.Description); TValidation = categorical(dataValidation.Category);
문서를 시퀀스로 변환하기
문서를 신경망에 입력하기 위해 단어 인코딩을 사용하여 문서를 숫자형 인덱스로 구성된 시퀀스로 변환합니다.
문서에서 단어 인코딩을 만듭니다.
enc = wordEncoding(documentsTrain);
단어 인코딩의 단어집 크기를 표시합니다. 단어집 크기는 단어 인코딩의 고유 단어 개수입니다.
numWords = enc.NumWords
numWords = 438
doc2sequence
함수를 사용하여 문서를 정수 시퀀스로 변환합니다.
XTrain = doc2sequence(enc,documentsTrain);
훈련 데이터에서 만들어진 단어 인코딩을 사용하여 검증 문서를 시퀀스로 변환합니다.
XValidation = doc2sequence(enc,documentsValidation);
신경망 아키텍처 정의하기
분류 작업을 위한 신경망 아키텍처를 정의합니다.
다음 단계는 신경망 아키텍처를 설명합니다.
입력 크기를 1로 지정합니다. 이는 정수 시퀀스 입력의 채널 차원에 대응됩니다.
차원 100의 단어 임베딩을 사용하여 입력을 임베딩합니다.
n-gram 길이 2, 3, 4, 5에 대해 컨벌루션 계층, 배치 정규화 계층, ReLU 계층, 드롭아웃 계층, 최대 풀링 계층을 포함하는 계층 블록을 만듭니다.
각 블록에 대해 크기가 1×N인 컨벌루션 필터 200개와 전역 최댓값 풀링 계층을 지정합니다.
입력 계층을 각 블록에 연결하고 결합 계층을 사용하여 블록의 출력을 결합합니다.
출력을 분류하기 위해 출력 크기가 K인 완전 연결 계층과 소프트맥스 계층을 포함합니다. 여기서 K는 클래스 개수입니다.
신경망 하이퍼파라미터를 지정합니다.
embeddingDimension = 100; ngramLengths = [2 3 4 5]; numFilters = 200;
먼저 입력 계층과 차원이 100인 단어 임베딩 계층을 포함하는 dlnetwork
객체를 만듭니다. 단어 임베딩 계층을 컨벌루션 계층에 연결하는 데 도움이 되도록 단어 임베딩 계층 이름을 "emb"
로 설정합니다. 컨벌루션 계층이 훈련 중에 시퀀스의 길이가 0이 되도록 컨벌루션하지 않도록 하려면 MinLength
옵션을 훈련 데이터에서 가장 짧은 시퀀스의 길이로 설정합니다.
net = dlnetwork;
minLength = min(doclength(documentsTrain));
layers = [
sequenceInputLayer(1,MinLength=minLength)
wordEmbeddingLayer(embeddingDimension,numWords,Name="emb")];
net = addLayers(net,layers);
각 n-gram 길이에 대해 1-D 컨벌루션 계층, 배치 정규화 계층, ReLU 계층, 드롭아웃 계층, 1-D 전역 최댓값 풀링 계층의 블록을 만듭니다. 각 블록을 단어 임베딩 계층에 연결합니다.
numBlocks = numel(ngramLengths); for j = 1:numBlocks N = ngramLengths(j); block = [ convolution1dLayer(N,numFilters,Name="conv"+N,Padding="same") batchNormalizationLayer(Name="bn"+N) reluLayer(Name="relu"+N) dropoutLayer(0.2,Name="drop"+N) globalMaxPooling1dLayer(Name="max"+N)]; net = addLayers(net,block); net = connectLayers(net,"emb","conv"+N); end
결합 계층, 완전 연결 계층, 소프트맥스 계층을 추가합니다.
numClasses = numel(classNames); layers = [ concatenationLayer(1,numBlocks,Name="cat") fullyConnectedLayer(numClasses,Name="fc") softmaxLayer(Name="soft")]; net = addLayers(net,layers);
전역 최댓값 풀링 계층을 결합 계층에 연결하고 신경망 아키텍처를 플롯으로 표시합니다.
for j = 1:numBlocks N = ngramLengths(j); net = connectLayers(net,"max"+N,"cat/in"+j); end figure plot(net) title("Network Architecture")
신경망 훈련시키기
다음과 같이 훈련 옵션을 지정합니다.
미니 배치 크기를 128로 지정하여 훈련시킵니다. 기본적으로
trainnet
(Deep Learning Toolbox) 함수는 GPU를 사용할 수 있으면 GPU를 사용합니다. GPU에서 훈련시키려면 Parallel Computing Toolbox™ 라이선스와 지원되는 GPU 장치가 필요합니다. 지원되는 장치에 대한 자세한 내용은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오. GPU를 사용할 수 없는 경우,trainnet
함수는 CPU를 사용합니다. 실행 환경을 지정하려면ExecutionEnvironment
훈련 옵션을 사용하십시오.검증 데이터를 사용하여 신경망을 검증합니다.
검증 손실이 가장 낮은 신경망을 반환합니다.
훈련 진행 상황을 플롯에서 모니터링하고 정확도 메트릭을 모니터링합니다.
세부 정보가 출력되지 않도록 합니다.
훈련 데이터는 행과 열이 각각 채널과 시간 스텝에 대응하는 시퀀스를 가지므로 입력 데이터 형식
"CTB"
(채널, 시간, 배치)를 지정합니다.
options = trainingOptions("adam", ... MiniBatchSize=128, ... ValidationData={XValidation,TValidation}, ... OutputNetwork="best-validation", ... Plots="training-progress", ... Metrics="accuracy", ... Verbose=false, ... InputDataFormats='CTB');
trainnet
함수를 사용하여 신경망을 훈련시킵니다.
net = trainnet(XTrain,TTrain,net,"crossentropy",options);
신경망 테스트하기
신경망을 사용하여 예측을 수행합니다. 여러 개의 관측값을 사용하여 예측을 수행하려면 minibatchpredict
함수를 사용합니다. 예측 점수를 레이블로 변환하려면 scores2label
함수를 사용합니다. minibatchpredict
함수는 GPU를 사용할 수 있으면 자동으로 GPU를 사용합니다. GPU를 사용하려면 Parallel Computing Toolbox™ 라이선스와 지원되는 GPU 장치가 필요합니다. 지원되는 장치에 대한 자세한 내용은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오. GPU를 사용할 수 없는 경우, 함수는 CPU를 사용합니다.
데이터는 행과 열이 각각 채널과 시간 스텝에 대응하는 시퀀스를 가지므로 입력 데이터 형식 "CTB"
(채널, 시간, 배치)를 지정합니다.
scores = minibatchpredict(net,XValidation,InputDataFormats="CTB");
YValidation = scores2label(scores,classNames);
예측값을 혼동행렬 차트로 시각화합니다.
figure confusionchart(TValidation,YValidation)
분류 정확도를 계산합니다. 정확도는 올바르게 예측된 레이블의 비율입니다.
accuracy = mean(TValidation == YValidation)
accuracy = 0.9688
새 데이터를 사용하여 예측하기
새 보고서 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."];
훈련 문서와 검증 문서에서 사용한 것과 동일한 전처리 단계를 사용하여 텍스트 데이터를 전처리합니다.
documentsNew = preprocessText(reportsNew); XNew = doc2sequence(enc,documentsNew);
훈련된 신경망을 사용하여 새 시퀀스를 분류합니다.
scores = minibatchpredict(net,XNew,InputDataFormats="CTB");
YNew = scores2label(scores,classNames)
YNew = 3×1 categorical
Leak
Electronic Failure
Mechanical Failure
텍스트 함수 전처리하기
preprocessTextData
함수는 데이터를 입력으로 받아 다음 단계를 수행합니다.
텍스트를 토큰화합니다.
텍스트를 소문자로 변환합니다.
function documents = preprocessText(textData) documents = tokenizedDocument(textData); documents = lower(documents); end
참고 항목
fastTextWordEmbedding
| wordcloud
| wordEmbedding
| layerGraph
(Deep Learning Toolbox) | convolution2dLayer
(Deep Learning Toolbox) | batchNormalizationLayer
(Deep Learning Toolbox) | trainingOptions
(Deep Learning Toolbox) | trainNetwork
(Deep Learning Toolbox) | doc2sequence
| tokenizedDocument
| documentEmbedding
도움말 항목
- 딥러닝을 사용하여 텍스트 데이터 분류하기
- Classify Out-of-Memory Text Data Using Deep Learning
- 분류를 위한 간단한 텍스트 모델 만들기
- 토픽 모델을 사용하여 텍스트 데이터 분석하기
- 다단어 구문을 사용하여 텍스트 데이터 분석하기
- 감성 분류기 훈련시키기
- 딥러닝을 사용한 시퀀스 분류 (Deep Learning Toolbox)
- MATLAB의 딥러닝 (Deep Learning Toolbox)