Main Content

사용자 지정 미니 배치 데이터저장소를 사용하여 시퀀스 데이터에 대해 신경망 훈련시키기

이 예제에서는 사용자 지정 미니 배치 데이터저장소를 사용하여 메모리에 다 담을 수 없을 정도로 큰 시퀀스 데이터를 대상으로 딥러닝 신경망을 훈련시키는 방법을 보여줍니다.

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

이 예제에서는 사용자 지정 미니 배치 데이터저장소 sequenceDatastore를 사용합니다. 이 데이터저장소는 이 예제에 지원 파일로 첨부되어 있습니다. 데이터저장소 함수를 사용자 지정하여 이 데이터저장소를 데이터에 맞게 수정할 수 있습니다. 고유한 사용자 지정 미니 배치 데이터저장소를 만드는 예제는 Develop Custom Mini-Batch Datastore 항목을 참조하십시오.

훈련 데이터 불러오기

[1]과 [2]에서 설명한 Japanese Vowels 데이터 세트를 불러옵니다. zip 파일 japaneseVowels.zip은 다양한 길이의 시퀀스를 포함합니다. 이 시퀀스는 각각 훈련 시퀀스와 테스트 시퀀스를 포함하는 TrainTest라는 두 폴더로 나뉘어 있습니다. 각 폴더에서 시퀀스는 1부터 9까지 번호가 지정된 하위 폴더로 나뉘어 있습니다. 하위 폴더의 이름은 레이블 이름입니다. 하나의 MAT 파일은 각 시퀀스를 나타냅니다. 각 시퀀스는 각 특징에 대해 하나의 행을 갖는 12개의 행과 각 시간 스텝에 대해 하나의 열을 갖는 가변 개수의 열로 이루어진 행렬입니다. 행 개수는 시퀀스 차원이고, 열 개수는 시퀀스 길이입니다.

시퀀스 데이터의 압축을 풉니다.

filename = "japaneseVowels.zip";
outputFolder = fullfile(tempdir,"japaneseVowels");
unzip(filename,outputFolder);

사용자 지정 미니 배치 데이터저장소 만들기

사용자 지정 미니 배치 데이터저장소를 만듭니다. 미니 배치 데이터저장소 sequenceDatastore는 폴더에서 데이터를 읽어 들이고 하위 폴더 이름에서 레이블을 가져옵니다.

sequenceDatastore를 사용하여 시퀀스 데이터를 포함하는 데이터저장소를 만듭니다.

folderTrain = fullfile(outputFolder,"Train");
dsTrain = sequenceDatastore(folderTrain)
dsTrain = 
  sequenceDatastore with properties:

            Datastore: [1×1 matlab.io.datastore.FileDatastore]
               Labels: [270×1 categorical]
           NumClasses: 9
    SequenceDimension: 12
        MiniBatchSize: 128
      NumObservations: 270

LSTM 신경망 아키텍처 정의하기

LSTM 신경망 아키텍처를 정의합니다. 입력 데이터의 시퀀스 차원을 입력 크기로 지정합니다. 은닉 유닛 100개를 갖는 LSTM 계층을 지정하고 시퀀스의 마지막 요소를 출력합니다. 마지막으로, 출력 크기가 클래스 개수와 같은 완전 연결 계층을 지정하고 그 뒤에 소프트맥스 계층을 지정합니다.

inputSize = dsTrain.SequenceDimension;
numClasses = dsTrain.NumClasses;
numHiddenUnits = 100;
layers = [
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits,OutputMode="last")
    fullyConnectedLayer(numClasses)
    softmaxLayer];

훈련 옵션을 지정합니다. adam을 솔버로 지정하고 GradientThreshold를 1로 지정합니다. 미니 배치의 크기를 27로 설정하고 최대 Epoch 횟수를 75로 설정합니다. 데이터저장소가 trainnet 함수에 필요한 크기의 미니 배치를 만들도록 하려면 데이터저장소의 미니 배치 크기도 같은 값으로 설정하십시오.

미니 배치는 짧은 시퀀스로 구성된 크기가 작은 배치이므로 훈련에는 CPU가 더 적절합니다. ExecutionEnvironmentcpu로 설정합니다. GPU를 사용할 수 있는 경우 GPU에서 훈련시키려면 ExecutionEnvironmentauto(디폴트 값)로 설정하십시오.

miniBatchSize = 27;
options = trainingOptions("adam", ...
    InputDataFormats="CTB", ...
    Metrics="accuracy", ...
    ExecutionEnvironment="cpu", ...
    MaxEpochs=40, ...
    MiniBatchSize=miniBatchSize, ...
    GradientThreshold=1, ...
    Verbose=false, ...
    Plots="training-progress");
dsTrain.MiniBatchSize = miniBatchSize;

지정된 훈련 옵션으로 LSTM 신경망을 훈련시킵니다. 분류에는 교차 엔트로피 손실을 사용합니다.

net = trainnet(dsTrain,layers,"crossentropy",options);

신경망 테스트하기

테스트 데이터에서 시퀀스 데이터저장소를 만듭니다.

folderTest = fullfile(outputFolder,"Test");
dsTest = sequenceDatastore(folderTest);

테스트 데이터를 분류합니다. 여러 개의 관측값을 사용하여 예측을 수행하려면 minibatchpredict 함수를 사용합니다. minibatchpredict 함수는 GPU를 사용할 수 있으면 자동으로 GPU를 사용합니다. GPU를 사용하려면 Parallel Computing Toolbox™ 라이선스와 지원되는 GPU 장치가 필요합니다. 지원되는 장치에 대한 자세한 내용은 GPU 연산 요구 사항을 참조하십시오. GPU를 사용할 수 없는 경우, 이 함수는 CPU를 사용합니다. 실행 환경을 지정하려면 ExecutionEnvironment 옵션을 사용하십시오. 훈련 데이터와 같도록 미니 배치의 크기를 지정합니다. 데이터저장소가 minibatchpredict 함수에 필요한 크기의 미니 배치를 만들도록 하려면 데이터저장소의 미니 배치 크기도 같은 값으로 설정하십시오.

dsTest.MiniBatchSize = miniBatchSize;
YPred = minibatchpredict(net,dsTest,InputDataFormats="CTB",MiniBatchSize=miniBatchSize);

예측의 분류 정확도를 계산합니다. 예측 점수를 레이블로 변환하려면 scores2label 함수를 사용합니다.

YTest = dsTest.Labels;
YPred = scores2label(YPred, categories(YTest));
acc = sum(YPred == YTest)./numel(YTest)
acc = 0.9486

참고 문헌

[1] Kudo, M., J. Toyama, and M. Shimbo. "Multidimensional Curve Classification Using Passing-Through Regions." Pattern Recognition Letters. Vol. 20, No. 11–13, pp. 1103–1111.

[2] Kudo, M., J. Toyama, and M. Shimbo. Japanese Vowels Data Set. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels

참고 항목

| | | |

관련 항목